使用SSL加密与Kubernetes apiServer的通信
生成CA私钥证书创建集群的root CA创建apiServer的私钥服务端证书创建访问apiServer的各个组件使用的客户端证书在k8s集群部署CA证书配置apiServer配置kubectl准备context配置文件配置controllerManagerschedulerproxy访问apiServer的地址配置controllerManager配置scheduler配置k
生成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"
- 1
- 2
- 3
- 4
创建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
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
1、创建openssl.cnf
:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
使用有API被访问的Master的IP地址替换${MASTER_IPV4}
,使用自己规划作为kubernetes service IP端的首IP替换${K8S_SERVICE_IP}
如:一般以10.100.0.0/16
作为service的服务IP端,则此处以10.100.0.1
替换${K8S_SERVICE_IP}
如果在高可用配置中部署多个Master节点,需要添加更多的TLS subjectAltNames (SANs)。每个证书合适的SANs配置依赖于从节点与kubectl
用户是怎样与Master节点通讯的:直接通过IP地址、通过负载均衡、或者通过解析DNS名称。
- 1
- 2
- 3
从节点将通过${MASTER_DNS_NAME}
访问到Loadbalancer。
创建私钥与证书
#创建私钥#
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
- 1
- 2
- 3
- 4
- 5
- 6
创建访问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
- 1
- 2
- 3
- 4
在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"
- 1
配置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
- 1
- 2
- 3
- 4
准备context配置文件
context是cluster、namespace、user三个信息的集合。
把已为kubectl配置好的context,保存到公共文件,供controllerManager、scheduler、kubelet、proxy在启动参数里引用。
输出kubectl的当前context配置:
kubectl config view
- 1
把输出的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
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
配置controllerManager、scheduler、proxy访问apiServer的地址
修改参数文件/etc/kubernetes/config
KUBE_MASTER="--master=https://centos-master:6443"
- 1
配置controllerManager
修改参数文件/etc/kubernetes/controller-manager
KUBE_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"
- 1
配置scheduler
修改参数文件/etc/kubernetes/scheduler
KUBE_SCHEDULER_ARGS="--kubeconfig=/etc/kubernetes/kube-admin-context.yaml"
- 1
配置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"
- 1
- 2
配置proxy
修改参数文件/etc/kubernetes/proxy
KUBE_PROXY_ARGS="--kubeconfig=/etc/kubernetes/kube-admin-context.yaml"
- 1
重启k8s集群
停止node
for SERVICES in kube-proxy kubelet flanneld docker; do
systemctl stop $SERVICES
done
- 1
- 2
- 3
停止master
for SERVICES in etcd kube-apiserver kube-controller-manager kube-scheduler flanneld; do
systemctl stop $SERVICES
done
- 1
- 2
- 3
重启master
for SERVICES in etcd kube-apiserver kube-controller-manager kube-scheduler flanneld; do
systemctl restart $SERVICES
systemctl enable $SERVICES
systemctl status $SERVICES
done
- 1
- 2
- 3
- 4
- 5
重启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
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
验证集群启动情况
查看pod
kubectl 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
- 1
- 2
- 3
- 4
- 5
- 6
查看endpoint
kubectl get services --all-namespaces
kubectl get endpoints --all-namespaces
- 1
- 2
如果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
更多推荐
所有评论(0)