使用SSL加密与Kubernetes apiServer的通信
2017-05-13 02:53
555 查看
生成CA私钥证书
创建集群的root CA
创建apiServer的私钥服务端证书
创建访问apiServer的各个组件使用的客户端证书
在k8s集群部署CA证书
配置apiServer
配置kubectl
准备context配置文件
配置controllerManagerschedulerproxy访问apiServer的地址
配置controllerManager
配置scheduler
配置kubelet
配置proxy
重启k8s集群
验证集群启动情况
CA的CommonName不是必须为kube-ca,可以随意指定。
因为SSL/TLS协议要求服务器地址需与CA签署的服务器证书里的subjectAltName信息一致。
这里配置的最后两个IP分别是clusterIP取值范围里的第一个可用值、master机器的IP。
k8s会自动创建一个service和对应的endpoint,来为集群内的容器提供apiServer服务;
service默认使用第一个可用的clusterIP作为虚拟IP,放置于default名称空间,名称为kubernetes,端口是443;openssl.cnf里的DNS1~4就是从容器里访问这个service时会使用到的域名。
创建私钥与证书
客户端证书的CommonName并不需要匹配k8s里的某个account。
https://kubernetes.io/docs/getting-started-guides/centos/centos_manual_config/
k8s安装包无法从官方源下载时,可改用阿里云提供的源,centos的配置方式详见阿里云提供的help
http://mirrors.aliyun.com
如果是以容器方式运行k8s组件,按此文章进行配置
https://coreos.com/kubernetes/docs/latest/deploy-master.html
这里监听SSL/TLS的端口是6443;若指定小于1024的端口,有可能会导致启动apiServer失败。
即使不配置–insecure-access、–insecure-port参数,在master机器上,还是会默认开8080端口提供未加密的HTTP服务;不过只能用localhost作为访问地址。
把已为kubectl配置好的context,保存到公共文件,供controllerManager、scheduler、kubelet、proxy在启动参数里引用。
输出kubectl的当前context配置:
把输出的context配置保存到文件/etc/kubernetes/kube-admin-context.yaml,类似如下内容:
其中–pod-infra-container-image是pod通信接口容器在私有仓库的镜像路径。
停止master
重启master
重启node
查看endpoint
如果pod启动异常,使用kubectl describe命令查看pod启动情况;如pod因secret失效而启动失败,则删除每个namespace下的default账户,并删除全部ReplicaSet,使deployment重新分配ReplicaSet和pod。
创建集群的root CA
创建apiServer的私钥服务端证书
创建访问apiServer的各个组件使用的客户端证书
在k8s集群部署CA证书
配置apiServer
配置kubectl
准备context配置文件
配置controllerManagerschedulerproxy访问apiServer的地址
配置controllerManager
配置scheduler
配置kubelet
配置proxy
重启k8s集群
验证集群启动情况
生成CA、私钥、证书
创建集群的root CA
把所有私钥、证书都放到目录/k8s/rsa里;CA的CommonName不是必须为kube-ca,可以随意指定。
mkdir -p /k8s/rsa cd /k8s/rsa openssl genrsa -out ca-key.pem 2048 openssl req -x509 -new -nodes -key ca-key.pem -days 10000 -out ca.pem -subj "/CN=kube-ca"
创建apiServer的私钥、服务端证书
创建证书配置文件openssl.cnf,在alt_names里指定所有访问服务时会使用的目标域名和IP;因为SSL/TLS协议要求服务器地址需与CA签署的服务器证书里的subjectAltName信息一致。
这里配置的最后两个IP分别是clusterIP取值范围里的第一个可用值、master机器的IP。
k8s会自动创建一个service和对应的endpoint,来为集群内的容器提供apiServer服务;
service默认使用第一个可用的clusterIP作为虚拟IP,放置于default名称空间,名称为kubernetes,端口是443;openssl.cnf里的DNS1~4就是从容器里访问这个service时会使用到的域名。
[req] req_extensions = v3_req distinguished_name = req_distinguished_name [req_distinguished_name] [ v3_req ] basicConstraints = CA:FALSE keyUsage = nonRepudiation, digitalSignature, keyEncipherment subjectAltName = @alt_names [alt_names] DNS.1 = kubernetes DNS.2 = kubernetes.default DNS.3 = kubernetes.default.svc DNS.4 = kubernetes.default.svc.cluster.local DNS.5 = localhost DNS.6 = centos-master IP.1 = 127.0.0.1 IP.2 = 10.254.0.1 IP.3 = 192.168.137.240
创建私钥与证书
#创建私钥# openssl genrsa -out apiserver-key.pem 2048 #创建certificate signing request文件apiserver.csr,里面包含的apiserver的公开信息,如:公钥、名称、可访问地址# openssl req -new -key apiserver-key.pem -out apiserver.csr -subj "/CN=kube-master" -config openssl.cnf #生成经过CA签署的服务端证书,里面包含服务端信息、CA的公钥,以及经CA私钥加密的服务端信息的hash值# openssl x509 -req -in apiserver.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out apiserver.pem -days 9000 -extensions v3_req -extfile openssl.cnf
创建访问apiServer的各个组件使用的客户端证书
controllerManager、scheduler、kubelet、proxy、kubectl都使用这里生成的管理员证书。客户端证书的CommonName并不需要匹配k8s里的某个account。
cd /k8s/rsa openssl genrsa -out admin-key.pem 2048 openssl req -new -key admin-key.pem -out admin.csr -subj "/CN=kube-admin" openssl x509 -req -in admin.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out admin.pem -days 9000
在k8s集群部署CA、证书
前提是本地已按照官方文档在centos上安装了k8s集群https://kubernetes.io/docs/getting-started-guides/centos/centos_manual_config/
k8s安装包无法从官方源下载时,可改用阿里云提供的源,centos的配置方式详见阿里云提供的help
http://mirrors.aliyun.com
如果是以容器方式运行k8s组件,按此文章进行配置
https://coreos.com/kubernetes/docs/latest/deploy-master.html
配置apiServer
修改参数文件/etc/kubernetes/apiserver这里监听SSL/TLS的端口是6443;若指定小于1024的端口,有可能会导致启动apiServer失败。
即使不配置–insecure-access、–insecure-port参数,在master机器上,还是会默认开8080端口提供未加密的HTTP服务;不过只能用localhost作为访问地址。
KUBE_API_ARGS="--bind-address=0.0.0.0 --secure-port=6443 --tls-cert-file=/k8s/rsa/apiserver.pem --tls-private-key-file=/k8s/rsa/apiserver-key.pem --client-ca-file=/k8s/rsa/ca.pem --service-account-key-file=/k8s/rsa/apiserver-key.pem"
配置kubectl
修改kubectl命令行工具默认使用的apiServer地址、集群CA和客户端证书。kubectl config set-cluster default-cluster --server=https://centos-master:6443 --certificate-authority=/k8s/rsa/ca.pem kubectl config set-credentials default-admin --certificate-authority=/k8s/rsa/ca.pem --client-key=/k8s/rsa/admin-key.pem --client-certificate=/k8s/rsa/admin.pem kubectl config set-context default-system --cluster=default-cluster --user=default-admin kubectl config use-context default-system
准备context配置文件
context是cluster、namespace、user三个信息的集合。把已为kubectl配置好的context,保存到公共文件,供controllerManager、scheduler、kubelet、proxy在启动参数里引用。
输出kubectl的当前context配置:
kubectl config view
把输出的context配置保存到文件/etc/kubernetes/kube-admin-context.yaml,类似如下内容:
apiVersion: v1 clusters: - cluster: certificate-authority: /k8s/rsa/ca.pem server: https://centos-master:6443 name: default-cluster contexts: - context: cluster: default-cluster user: default-admin name: default-context - context: cluster: default-cluster user: default-admin name: default-system current-context: default-system kind: Config preferences: {} users: - name: default-admin user: client-certificate: /k8s/rsa/admin.pem client-key: /k8s/rsa/admin-key.pem
配置controllerManager、scheduler、proxy访问apiServer的地址
修改参数文件/etc/kubernetes/configKUBE_MASTER="--master=https://centos-master:6443"
配置controllerManager
修改参数文件/etc/kubernetes/controller-managerKUBE_CONTROLLER_MANAGER_ARGS="--kubeconfig=/etc/kubernetes/kube-admin-context.yaml --root-ca-file=/k8s/rsa/ca.pem --service-account-private-key-file=/k8s/rsa/apiserver-key.pem"
配置scheduler
修改参数文件/etc/kubernetes/schedulerKUBE_SCHEDULER_ARGS="--kubeconfig=/etc/kubernetes/kube-admin-context.yaml"
配置kubelet
修改参数文件/etc/kubernetes/kubelet其中–pod-infra-container-image是pod通信接口容器在私有仓库的镜像路径。
KUBELET_API_SERVER="--api-servers=https://centos-master:6443" KUBELET_ARGS="--kubeconfig=/etc/kubernetes/kube-admin-context.yaml --pod-infra-container-image=centos-master:5000/pause-amd64:3.0"
配置proxy
修改参数文件/etc/kubernetes/proxyKUBE_PROXY_ARGS="--kubeconfig=/etc/kubernetes/kube-admin-context.yaml"
重启k8s集群
停止nodefor SERVICES in kube-proxy kubelet flanneld docker; do systemctl stop $SERVICES done
停止master
for SERVICES in etcd kube-apiserver kube-controller-manager kube-scheduler flanneld; do systemctl stop $SERVICES done
重启master
for SERVICES in etcd kube-apiserver kube-controller-manager kube-scheduler flanneld; do systemctl restart $SERVICES systemctl enable $SERVICES systemctl status $SERVICES done
重启node
iptables --flush iptables -tnat --flush for SERVICES in kube-proxy kubelet flanneld docker; do systemctl restart $SERVICES systemctl enable $SERVICES systemctl status $SERVICES done
验证集群启动情况
查看podkubectl get nodes kubectl get deployments --all-namespaces kubectl get ReplicationController --all-namespaces kubectl get DaemonSets --all-namespaces kubectl get ReplicaSets --all-namespaces kubectl get pods --all-namespaces
查看endpoint
kubectl get services --all-namespaces kubectl get endpoints --all-namespaces
如果pod启动异常,使用kubectl describe命令查看pod启动情况;如pod因secret失效而启动失败,则删除每个namespace下的default账户,并删除全部ReplicaSet,使deployment重新分配ReplicaSet和pod。
kubectl delete serviceaccount default -n default kubectl delete serviceaccount default -n dev kubectl delete serviceaccount default -n kube-system
相关文章推荐
- 使用SSL加密与Kubernetes apiServer的通信
- Chapter 1 Securing Your Server and Network(5):使用SSL加密会话
- 使用OpenSSL API 建立SSL安全通信的一般流程
- Chapter 1 Securing Your Server and Network(5):使用SSL加密会话
- 利用OpenSSL编写SSL通信程序时常使用的API
- 使用OpenSSL API 建立SSL安全通信的一般流程
- 配置 OpenLDAP 使用 SSL/TLS 加密数据通信
- asp.net api 使用SSL 加密登陆 思路
- Chapter 1 Securing Your Server and Network(5):使用SSL加密会话
- com.microsoft.sqlserver.jdbc.SQLServerException: 驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。错误:“java
- Chapter 1 Securing Your Server and Network(5):使用SSL加密会话
- OpenSSL编程初探1 --- 使用OpenSSL API建立SSL通信的一般流程简介
- com.microsoft.sqlserver.jdbc.SQLServerException: 驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立 安全连接。错误:“SQL
- com.microsoft.sqlserver.jdbc.SQLServerException: 驱动程序无法使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。错误: RSA pr
- 使用Microsoft CryptoAPI进行加密、解密、签名及验证(代码)
- 检测到通信错误。正在使用的通信协议:"TCP/IP"。正在使用的通信API:"SOCKETS"。检测到错误的位置:""。检测到错误的通信函数:"gethostbyname"。协议特定的错误代码:"*"、"11004"、"*"。 SQLST
- 3、Server API for JavaScript使用地图工具条
- Solr Server对外提供Web Service的沟通方式 使用SolrJ跟Solr Server通信
- 使用windows crypto API加密解密
- Jdk中通信API使用指南