多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
[TOC] ## **一、ETCD** ## **二、K8S** #### **2.1 配置kube-apiserver使用https访问etcd(每个Master节点都要操作)** 编辑`/etc/kubernetes/apiserver`文件,找到如下一行: ``` ETCD_SERVERS="--etcd-servers=http://192.168.92.121:2379,http://192.168.92.122:2379" ``` 把http改成https,并且添加`--etcd-keyfile`和`--etcd-certfile`两个参数,最终为: ``` ETCD_SERVERS="--etcd-servers=https://192.168.92.121:2379,https://192.168.92.122:2379 --etcd-keyfile=/etc/kubernetes/key/etcd/peer.key --etcd-certfile=/etc/kubernetes/key/etcd/peer.crt" ``` #### **2.2 重新配置kube-apiserver的服务证书(每个Master节点都要操作)** *进入到`/etc/kubernetes/key/`目录下,注意2.2小节的命令都是在该目录下执行。* 执行命令,生成kube-apiserver.key ``` $ openssl genrsa -out kube-apiserver.key 4096 ``` 创建`/etc/kubernetes/key/kube-apiserver.csr.conf`文件,内容如下,文件内容中有几点需要注意: * `{{vip}}`要替换成k8s集群的vip,注意文件中有两个`{{vip}}` * `IP.3 = 10.254.0.1`这一行中的这个IP是kubernetes这个service的IP,k8s-1.8.x版本默认是这个值,你需要通过执行命令`kubectl get service kubernetes`进行确认。如果命令返回的值不一样,则需要进行对应的更改 ``` $ kubectl get service kubernetes NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.254.0.1 <none> 443/TCP 1d ``` * `DNS.4`与`DNS.5`这两行,结尾分别为`kube`与`kube.local`,这个需要查看kubelet的配置确认,如果kubelet的配置为其他,则这两行需要进行对应的修改。 ``` $ ps -ef | grep kubelet ... --cluster-domain=kube.local ... ``` ``` [ req ] default_bits = 4096 prompt = no default_md = sha256 req_extensions = req_ext distinguished_name = dn [ dn ] C = CN ST = GuangDong L = GuangZhou O = CTYUN OU = CCSE CN = {{vip}} [ req_ext ] subjectAltName = @alt_names [ alt_names ] DNS.1 = kubernetes DNS.2 = kubernetes.default DNS.3 = kubernetes.default.svc DNS.4 = kubernetes.default.svc.kube DNS.5 = kubernetes.default.svc.kube.local IP.1 = {{vip}} IP.2 = 127.0.0.1 IP.3 = 10.254.0.1 [ v3_ext ] authorityKeyIdentifier=keyid,issuer:always basicConstraints=CA:FALSE keyUsage=keyEncipherment,dataEncipherment extendedKeyUsage=serverAuth,clientAuth subjectAltName=@alt_names ``` 接着,我们执行下面的命令,生成kube-apiserver的证书签名请求文件kube-apiserver.csr: ``` $ openssl req -new -key kube-apiserver.key -out kube-apiserver.csr -config kube-apiserver.csr.conf ``` 然后,我们使用CA证书对这个请求文件进行签名(确保该目录下dcos_ca.key与dcos_ca.crt文件都存在),得到kube-apiserver.crt: ``` $ openssl x509 -req -in kube-apiserver.csr -CA dcos_ca.crt -CAkey dcos_ca.key -CAcreateserial -out kube-apiserver.crt -days 36500 -extensions v3_ext -extfile kube-apiserver.csr.conf ``` 接下来,编辑`/etc/kubernetes/apiserver`文件,更改`--tls-private-key-file`和`--tls-cert-file`这两个参数的值为刚才的新证书,最终如下: ``` --tls-private-key-file=/etc/kubernetes/key/kube-apiserver.key --tls-cert-file=/etc/kubernetes/key/kube-apiserver.crt ``` 最后,重启kube-apiserver ``` $ systemctl restart kube-apiserver ``` #### **2.3 给kube-apiserver开启x509证书认证及RBAC授权(每个Master都要操作)** 编辑`/etc/kubernetes/apiserver`文件,添加启动参数`--client-ca-file`与`--authorization-mode`。我们可以把这个两个参数添加在该文件最后一行`API_ARGS="..."`里面,如下: ``` API_ARGS="--client-ca-file=/etc/kubernetes/key/dcos_ca.crt --authorization-mode=RBAC ..." ``` 然后,重启kube-apiserver #### **2.4 生成`/etc/kubernetes/admin.conf`文件** 本小节要在`/etc/kubernetes/key`目录下操作,在一个Master节点上操作即可。 执行如下命令,生成client_kubernetes-admin.key和client_kubernetes-admin.crt文件,这两个文件是其他组件(scheduler、controller-manager、kubectl等)用来访问kube-apiserver时所需要携带的身份信息: ``` $ openssl genrsa -out client_kubernetes-admin.key 4096 $ openssl req -new -nodes -key client_kubernetes-admin.key -out client_kubernetes-admin.csr -subj "/O=system:masters/CN=kubernetes-admin" $ openssl x509 -req -days 36500 -in client_kubernetes-admin.csr -CA dcos_ca.crt -CAkey dcos_ca.key -CAcreateserial -out client_kubernetes-admin.crt ``` 然后,创建文件`/etc/kubernetes/admin.conf`,内容如下: ``` apiVersion: v1 kind: Config clusters: - name: kubernetes cluster: server: https://{vip}:6443 certificate-authority-data: {cacert} users: - name: admin user: client-certificate-data: {cert} client-key-data: {key} contexts: - name: admin@kubernetes context: cluster: kubernetes user: admin current-context: admin@kubernetes ``` 上面有几个参数需要填充,`{vip}`要替换为master的vip。另外三个`{cacert}`、`{cert}`、`{key}`,通过下面的命令进行替换: ``` $ cacert=$(cat /etc/kubernetes/key/dcos_ca.crt | base64 -w 0) $ key=$(cat /etc/kubernetes/key/client_kubernetes-admin.key | base64 -w 0) $ cert=$(cat /etc/kubernetes/key/client_kubernetes-admin.crt | base64 -w 0) $ sed -i "s#{cacert}#${cacert}#g" /etc/kubernetes/admin.conf $ sed -i "s#{key}#${key}#g" /etc/kubernetes/admin.conf $ sed -i "s#{cert}#${cert}#g" /etc/kubernetes/admin.conf ``` 替换变量,得到完整的admin.conf文件后,把它拷贝到另外两个master节点的`/etc/kubernetes/`目录下。 #### **2.5 配置scheduler及controller-manager使用https访问kube-apiserver(每个Master节点都要操作)** 配置kube-scheduler,编辑`/etc/kubernetes/scheduler`,找到`MASTER="..."`一行,替换成如下: ``` MASTER="--kubeconfig=/etc/kubernetes/admin.conf" ``` 配置kube-controller-manager,编辑`/etc/kubernetes/controller-manager`,找到`MASTER="..."`一行,替换成如下: ``` MASTER="--kubeconfig=/etc/kubernetes/admin.conf" ``` 然后,重启组件: ``` $ systemctl restart kube-scheduler kube-controller-manager ``` #### **2.6 配置kubelet及kube-proxy使用https访问kube-apiserver(每个Worker节点都要操作)** 注意:如果Master节点上也安装了kubelet及kube-proxy,则Master节点也要操作。 配置kubelet,编辑`/etc/kubernetes/kubelet`,找到`KUBECONFIG="..."`一行,替换成如下: ``` KUBECONFIG="--kubeconfig=/etc/kubernetes/admin.conf" ``` 配置kube-proxy,编辑`/etc/kubernetes/proxy`,找到`KUBECONFIG="..."`一行,替换成如下: ``` KUBECONFIG="--kubeconfig=/etc/kubernetes/admin.conf" ``` 重启: ``` $ systemctl restart kubelet kube-proxy ``` #### **2.7 关闭kube-apiserver的8080端口(每个Master节点都要操作)** 编辑`/etc/kubernetes/apiserver`,找到配置参数`--insecure-port=8080`,更改成`--insecure-port=0`,然后重启kube-apiserver #### **2.8 更改kube-scheduler与kube-controller-manager监听127.0.0.1(每个Master节点都要操作)** 编辑`/etc/kubernetes/scheduler`,找到`--address=0.0.0.0`,更改为`--address=127.0.0.1`。 编辑`/etc/kubernetes/controller-manager`,找到`--address=0.0.0.0`,更改为`--address=127.0.0.1`。 重启kube-scheduler与kube-controller-manager #### **2.8 给kubelet添加认证(每个Worker节点都要操作)** 编辑`/etc/kubernetes/kubelet`文件,增加启动参数`--anonymous-auth=false`以及`--client-ca-file=/etc/kubernetes/key/dcos_ca.crt`,我们可以把这两个启动参数放在`KUBELET_ARGS="..."`这一行,如下: ``` KUBELET_ARGS="--anonymous-auth=false --client-ca-file=/etc/kubernetes/key/dcos_ca.crt ..." ``` 重启kubelet。 接着,我们需要给kube-apiserver增加启动参数(每个Master节点都要操作),因为kubectl exec命令进行到容器时,kube-apiserver需要调用kubelet,而此时kubelet开启了认证,kube-apiserver需要增加访问凭证。 编辑`/etc/kubernetes/apiserver`文件,我们在`API_ARGS="..."`这一行增加如下两个参数: ``` API_ARGS="--kubelet-client-certificate=/etc/kubernetes/key/kube-apiserver.crt --kubelet-client-key=/etc/kubernetes/key/kube-apiserver.key ..." ``` 然后,重启kube-apiserver。 ## **三、插件** #### **3.1 网络插件Calico** etcd增加授权后,calico无法直接访问etcd,因此我们需要把calico进行升级到3.8,这样calico就不需要访问etcd,访问kube-apiserver即可。 操作流程参考: http://10.128.28.71:8181/docs/ccse/ccse-1c7a1fi164k3u-ccse-1c7a1jga3g52n-ccse-1cmru4unrkigm-ccse-1cpg3q309o3k5.md #### **3.2 监控插件Heapster** 首先为heapster创建一个serviceAccount(如果已经有的话,创建命令会报错,不用理会),然后给它绑定权限 ``` $ kubectl create serviceaccount heapster -n kube-system $ kubectl create clusterrolebinding heapster-cluster-admin --serviceaccount kube-system:heapster --clusterrole cluster-admin ``` 然后执行命令编辑heapster这个deploymetnt,在适当位置增加serviceAccount这一行,然后更改--source这一行的内,最终如下: ``` apiVersion: extensions/v1beta1 kind: Deployment metadata: ... spec: ... template: ... spec: serviceAccount: heapster # 添加这一行 containers: - name: heapster ... command: - /heapster - --source=kubernetes:https://kubernetes.default # 更改这一行 ``` #### **3.3 负载均衡插件NginxIngressController** 首先为nginx-ingress-controller创建一个serviceAccount(如果已经有的话,创建命令会报错,不用理会),然后给它绑定权限 ``` $ kubectl create serviceaccount nginx-ingress-controller -n kube-system $ kubectl create clusterrolebinding nginx-ingress-controller-cluster-admin --serviceaccount kube-system:nginx-ingress-controller --clusterrole cluster-admin ``` 然后,编辑nginx-ingress-controller这个daemonset,在适当的位置添加`serviceAccount: nginx-ingress-controller`这一行。 然后,重启nginx-ingress-controller的容器。