接上次的继续认证版的k8s搭建。
kubectl
准备证书
mkdir -p /etc/kubernetes/ca/admin
cp ~/kubernetes-starter/target/ca/admin/admin-csr.json /etc/kubernetes/ca/admin/
cd /etc/kubernetes/ca/admin/
cfssl gencert \
-ca=/etc/kubernetes/ca/ca.pem \
-ca-key=/etc/kubernetes/ca/ca-key.pem \
-config=/etc/kubernetes/ca/ca-config.json \
-profile=kubernetes admin-csr.json | cfssljson -bare admin
ls
admin.csr admin-csr.json admin-key.pem admin.pem复制代码
8.2 配置kubectl
kubectl config set-cluster kubernetes \
--certificate-authority=/etc/kubernetes/ca/ca.pem \
--embed-certs=true \
--server=https://192.168.68.101:6443
kubectl config set-credentials admin \
--client-certificate=/etc/kubernetes/ca/admin/admin.pem \
--embed-certs=true \
--client-key=/etc/kubernetes/ca/admin/admin-key.pem
kubectl config set-context kubernetes \
--cluster=kubernetes --user=admin
kubectl config use-context kubernetes
cat ~/.kube/config复制代码
kubectl get componentstatus复制代码
calico-node(主节点生成证书,102,103经过scp拷贝过去)
准备证书
-
calico/node 这个docker 容器运行时访问 etcd 使用证书
-
cni 配置文件中,cni 插件须要访问 etcd 使用证书
-
calicoctl 操做集群网络时访问 etcd 使用证书
-
calico/kube-controllers 同步集群网络策略时访问 etcd 使用证书
mkdir -p /etc/kubernetes/ca/calico
cp ~/kubernetes-starter/target/ca/calico/calico-csr.json /etc/kubernetes/ca/calico/
cd /etc/kubernetes/ca/calico/
cfssl gencert \
-ca=/etc/kubernetes/ca/ca.pem \
-ca-key=/etc/kubernetes/ca/ca-key.pem \
-config=/etc/kubernetes/ca/ca-config.json \
-profile=kubernetes calico-csr.json | cfssljson -bare calico
ls复制代码
拷贝主节点证书calico
因为calico服务是全部节点都须要启动的,须要把这几个文件拷贝到每台服务器上 ** 经过主节点拷贝到102,103两台机器上
scp -r /etc/kubernetes/ca/ root@192.168.68.102:/etc/kubernetes/ca/
scp -r /etc/kubernetes/ca/ root@192.168.68.103:/etc/kubernetes/ca/复制代码
肯定下主节点的/etc/kubernetes/ca/ 和 102,103内的目录一致。
cp ~/kubernetes-starter/target/all-node/kube-calico.service /lib/systemd/system/
systemctl daemon-reload
service kube-calico start
calicoctl node status复制代码
kubelet
老铁这里让kubelet使用引导token的方式认证,因此认证方式跟以前的组件不一样,它的证书不是手动生成,而是由工做节点TLS BootStrap 向api-server请求,由主节点的controller-manager 自动签发。
建立角色绑定(主节点)
引导token的方式要求客户端向api-server发起请求时告诉他你的用户名和token,而且这个用户是具备一个特定的角色:system:node-bootstrapper,因此须要先将 bootstrap token 文件中的 kubelet-bootstrap 用户赋予这个特定角色,而后 kubelet 才有权限发起建立认证请求。 在主节点执行下面命令
kubectl -n kube-system get clusterrole
cat /etc/kubernetes/ca/kubernetes/token.csv
kubectl create clusterrolebinding kubelet-bootstrap \
--clusterrole=system:node-bootstrapper --user=kubelet-bootstrap复制代码
建立bootstrap.kubeconfig(102,103工做节点)
这个配置是用来完成bootstrap token认证的,保存了像用户,token等重要的认证信息,这个文件能够借助kubectl命令生成:(也能够本身写配置)
很重要。 0b1bd95b94caa5534d1d4a7318d51b0e 上边有说明这个咋来的
kubectl config set-cluster kubernetes \
--certificate-authority=/etc/kubernetes/ca/ca.pem \
--embed-certs=true \
--server=https://192.168.68.101:6443 \
--kubeconfig=bootstrap.kubeconfig
kubectl config set-credentials kubelet-bootstrap \
--token=0b1bd95b94caa5534d1d4a7318d51b0e\
--kubeconfig=bootstrap.kubeconfig
kubectl config set-context default \
--cluster=kubernetes \
--user=kubelet-bootstrap \
--kubeconfig=bootstrap.kubeconfig
kubectl config use-context default --kubeconfig=bootstrap.kubeconfig
mkdir -p /var/lib/kubelet
mkdir -p /etc/kubernetes
mkdir -p /etc/cni/net.d
mv bootstrap.kubeconfig /etc/kubernetes/复制代码
准备cni配置(102,103工做节点)
cp ~/kubernetes-starter/target/worker-node/10-calico.conf /etc/cni/net.d/复制代码
kubelet服务
cp ~/kubernetes-starter/target/worker-node/kubelet.service /lib/systemd/system/
systemctl daemon-reload
service kubelet start复制代码
kubectl get csr
kubectl get csr|grep 'Pending' | awk '{print $1}'| xargs kubectl certificate approve
journalctl -f -u kubelet复制代码
加入到主节点中。102
103请求加入,102已经加入
kube-proxy(子节点102,103)
准备证书
mkdir -p /etc/kubernetes/ca/kube-proxy
cp ~/kubernetes-starter/target/ca/kube-proxy/kube-proxy-csr.json /etc/kubernetes/ca/kube-proxy/
cd /etc/kubernetes/ca/kube-proxy/
cfssl gencert \
-ca=/etc/kubernetes/ca/ca.pem \
-ca-key=/etc/kubernetes/ca/ca-key.pem \
-config=/etc/kubernetes/ca/ca-config.json \
-profile=kubernetes kube-proxy-csr.json | cfssljson -bare kube-proxy
ls复制代码
生成kube-proxy.kubeconfig配置
kubectl config set-cluster kubernetes \
--certificate-authority=/etc/kubernetes/ca/ca.pem \
--embed-certs=true \
--server=https://192.168.68.101:6443 \
--kubeconfig=kube-proxy.kubeconfig
kubectl config set-credentials kube-proxy \
--client-certificate=/etc/kubernetes/ca/kube-proxy/kube-proxy.pem \
--client-key=/etc/kubernetes/ca/kube-proxy/kube-proxy-key.pem \
--embed-certs=true \
--kubeconfig=kube-proxy.kubeconfig
kubectl config set-context default \
--cluster=kubernetes \
--user=kube-proxy \
--kubeconfig=kube-proxy.kubeconfig
kubectl config use-context default --kubeconfig=kube-proxy.kubeconfig
mv kube-proxy.kubeconfig /etc/kubernetes/kube-proxy.kubeconfig复制代码
kube-proxy服务
mkdir -p /var/lib/kube-proxy
cp ~/kubernetes-starter/target/worker-node/kube-proxy.service /lib/systemd/system/
systemctl daemon-reload
yum -y install conntrack
service kube-proxy start
journalctl -f -u kube-proxy复制代码
12. kube-dns
kube-dns有些特别,由于它自己是运行在kubernetes集群中,以kubernetes应用的形式运行。因此它的认证受权方式跟以前的组件都不同。它须要用到service account认证和RBAC受权。 service account认证: 每一个service account都会自动生成本身的secret,用于包含一个ca,token和secret,用于跟api-server认证 RBAC受权: 权限、角色和角色绑定都是kubernetes自动建立好的。老铁只须要建立一个叫作kube-dns的 ServiceAccount便可,官方现有的配置已经把它包含进去了。
准备配置文件
在官方的基础上添加的变量,生成适合老铁咱们集群的配置。直接copy就能够啦
cd ~/kubernetes-starter复制代码
新的配置没有设定api-server。不访问api-server,它是怎么知道每一个服务的cluster ip和pod的endpoints的呢?这就是由于kubernetes在启动每一个服务service的时候会以环境变量的方式把全部服务的ip,端口等信息注入进来。
建立kube-dns(主节点101)
kubectl create -f ~/kubernetes-starter/target/services/kube-dns.yaml
kubectl -n kube-system get pods复制代码
PS:终于,安全版的kubernetes集群部署完成了。 涉及到的细节也很是多,就这都对了两篇博文了,若是每一个配置都详细解释估计得写本书了。从入门的角度了解认证和受权。 下面老铁们使用新集群先温习一下以前学习过的命令,而后再认识一些新的命令,新的参数,新的功能。