使用SSL加密与Kubernetes apiServer的通信

生成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

[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
IP.1 = ${K8S_SERVICE_IP}
IP.2 = ${MASTER_IPV4}
 
 
  • 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名称。

DNS.5 = ${MASTER_DNS_NAME}
IP.3 = ${MASTER_IP}
IP.4 = ${MASTER_LOADBALANCER_IP}
 
 
  • 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值