k8s如何加入TLS安全访问,技术发烧友为你探路

作者简介

以前外部访问k8s里的服务,都是直接以http方式进行的,缺少TLS安全,今天给大家详细分析一下怎么为k8s加TLS安全访问。

生成并信任自签名证书

首先这里生成自签名的服务器证书,官方介绍了 easyrsa, opensslcfssl三个工具,这里使用 cfssl

brew install -y cfssl# 生成默认配置文件cfssl print-defaults config > config.jsoncfssl print-defaults csr > csr.json# 生成自定义的config.json文件cp config.json ca-config.json# 生成ca和server的证书请求json文件cp csr.json ca-csr.jsoncp csr.json server-csr.json

编辑 ca-config.json,内容如下:

{    "signing": {        "default": {            "expiry": "168h"        },        "profiles": {            "k8s-local": {                "expiry": "8760h",                "usages": [                    "signing",                    "key encipherment",                    "server auth",                    "client auth"                ]            }        }    }}

编辑ca-csr.json,内容如下:

{    "CN": "k8s-local",    "key": {        "algo": "rsa",        "size": 2048    },    "names": [        {            "C": "CN",            "ST": "GuangDong",            "L": "Shenzhen",            "O": "my self signed certificate",            "OU": "self signed"        }    ]}

编辑server-csr.json,内容如下:

{    "CN": "k8s.local",    "hosts": [        "127.0.0.1",        "*.k8s.local"    ],    "key": {        "algo": "rsa",        "size": 2048    },    "names": [        {            "C": "CN",            "ST": "GuangDong",            "L": "Shenzhen",            "O": "my self signed certificate",            "OU": "self signed"        }    ]}

执行以下命令,生成CA证书及服务器证书

cfssl gencert -initca ca-csr.json | cfssljson -bare cacfssl gencert -ca=ca.pem -ca-key=ca-key.pem --config=ca-config.json -profile=k8s-local server-csr.json | cfssljson -bare server

这样就得到 ca.pemserver-key.pemserver.pem三个证书文件,其中 ca.pem是ca的证书, server-key.pem是服务器证书的密钥, server.pem是服务器证书。

KeychainAccess打开 ca.pem文件,然后修改设置,信任该CA,如下图如示:

k8s里使用自签名证书

创建默认的tls secret:

kubectl -n kube-system create secret tls default-tls-cert --key=server-key.pem --cert=server.pem

这里举例,现在有一个服务 k8s-dashboard,它是以下面的方式部署进k8s的:

helm install --name=local-k8s-dashboard --namespace kube-system stable/kubernetes-dashboard

而该k8s集群已经部署了nginx-ingress-controller,使用的以下命令:

helm install --name local-nginx-ingress stable/nginx-ingress

这里就可以创建 k8s-dashboard这个服务的ingress规则了,如下:

cat << EOF | kubectl create -f -apiVersion: extensions/v1beta1kind: Ingressmetadata:  annotations:    nginx.ingress.kubernetes.io/ssl-redirect: "true"    nginx.ingress.kubernetes.io/rewrite-target: /    nginx.ingress.kubernetes.io/secure-backends: "true"  name: k8s-dashboard-ingress  namespace: kube-systemspec:  tls:  - hosts:    - k8s-dashboard.k8s.local    secretName: default-tls-cert  rules:  - host: k8s-dashboard.k8s.local    http:      paths:      - backend:          serviceName: local-k8s-dashboard-kubernetes-dashboard          servicePort: 443EOF

注意,这里因为 k8s-dashboard这个服务本身是以https提供服务的,所以才加上了一些与ssl相关的 annotations,如果只是普通http服务,则不需要这些 annotations

最后在chrome浏览器中就可以以 https://k8s-dashboard.k8s.local访问 k8s-dashboard服务了,而且浏览器地址栏是安全的绿色哦。

何选nginx-ingress

在上述过程中对比了k8s里两个比较重要的ingress controller:traefik-ingress和nginx-ingress,比较起来,还是nginx-ingress功能更强大,与k8s整合更好一些,看来有k8s官方维护支持果然很强大。

nginx-ingress的用户指南也写得很详细,以后可以多看看。

参考

  1. https://kubernetes.io/docs/concepts/cluster-administration/certificates/
  2. https://github.com/helm/charts/blob/master/stable/kubernetes-dashboard
  3. https://github.com/helm/charts/tree/master/stable/nginx-ingress
  4. https://github.com/kubernetes/contrib/tree/master/ingress/controllers/nginx/examples/tls
  5. https://docs.traefik.io/configuration/backends/kubernetes/

原文发布于微信公众号 - 腾讯云TStack(gh_035269c8aa5f)

原文发表时间:2018-08-30

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏魏艾斯博客www.vpsss.net

Xshell 用 SSH 密钥登录服务器的配置过程

2.4K4
来自专栏友弟技术工作室

openSSH服务及其应用

1505
来自专栏云计算教程系列

如何在CentOS 6上安装DavMail

如果您的工作场所或学校使用Microsoft Exchange发送电子邮件,您可能希望从不支持Exchange协议的电子邮件客户端访问您的Exchange电子邮...

1864
来自专栏云计算教程系列

加固你的Roundcube服务器

Roundcube是一个Webmail客户端,具有强大的安全功能和来自其插件存储库的广泛自定义选项。本文介绍如何进一步保护基本的现有Roundcube安装。

2790
来自专栏友弟技术工作室

ssh服务

1645
来自专栏云计算教程系列

如何在Debian 9上为Nginx创建自签名SSL证书

TLS或传输层安全性及其前身SSL(代表安全套接字层)是用于将正常流量包装在受保护的加密包装中的Web协议。

3483
来自专栏云计算教程系列

如何设置让我们在Ubuntu 14.04上加密多个Apache虚拟主机的证书

Web服务器中使用SSL证书来加密服务器和客户端之间的流量,为访问应用程序的用户提供额外的安全性。让我们的加密提供了一种免费获取和安装可信证书的简便方法。

1050
来自专栏向治洪

Android开发中的安全

根据Android四大框架来解说安全机制 代码安全 java不同于C/C++,java是解释性语言,存在代码被反编译的隐患; 默认混淆器为progua...

2009
来自专栏云计算教程系列

如何在Ubuntu 16.04中为Nginx创建自签名SSL证书

TLS或称传输层安全性,及其前身SSL(代表安全套接字层)是用于将正常流量包装在受保护的加密包装中的Web协议。

4920
来自专栏FreeBuf

Apache shiro 1.2.4版本远程命令执行漏洞详解

*本文原创作者:zhujunboabc,本文属FreeBuf原创奖励计划,未经许可禁止转载 搜了一下,发现网上关于apache shiro 1.2.4版本的漏洞...

3515

扫码关注云+社区

领取腾讯云代金券