1.規劃
node
Master:linux
192.168.100.181git
192.168.100.182github
Node:web
192.168.100.183bootstrap
192.168.100.184vim
192.168.100.185centos
VIP:api
192.168.100.180安全
ansible主機:
192.168.100.123
全部節點均部署etcd,版本etcd-v3.3.8
在ansible主機生成ssl證書,並將全部證書放在了/root/ssl下(這裏我將全部證書分發至全部節點,可是實際有些證書相應節點並不須要,特此說明)
kubernetes二進制包以及壓縮後的文件夾均位於/root/下,版本v1.11.1
在node節點部署flannel,版本flannel-v0.10.0
keepalived和haproxy部署在master節點,版本分別爲keepalived-2.0.2和haproxy-1.5.18
2.配置ansible主機信任k8s節點
a.安裝ansible
# yum -y install ansible # cat /etc/ansible/hosts | egrep -v "^#|^$" [master] 192.168.100.181 192.168.100.182 [node] 192.168.100.183 192.168.100.184 192.168.100.185
b.生成ssh認證所需的公鑰和私鑰
# ssh-keygen -t rsa -P '' # vim /root/password.txt 192.168.100.181 123456 192.168.100.182 123456 192.168.100.183 123456 192.168.100.184 123456 192.168.100.185 123456
注:password.txt密碼文件裏爲IP及其對應root密碼。
c.配置分發密鑰的腳本並分發密鑰
# vim pass.sh #!/bin/bash ##分發祕鑰 copy-sshkey() { file=/root/password.txt if [ -e $file ] then echo "---password文件存在,分發祕鑰---" cat $file | while read line do host_ip=`echo $line | awk '{print $1}'` password=`echo $line | awk '{print $2}'` echo "$host_ip" /usr/bin/expect << EOF set time 20 spawn ssh-copy-id -i .ssh/id_rsa.pub root@$host_ip expect { "(yes/no)?" { send "yes\n" expect "password:" {send "$password\n"} } "*password:" { send "$password\n" } } expect eof EOF done else echo "---文件不存在---" fi } copy-sshkey if [ $? == 0 ] then echo "---腳本正常執行,刪除密碼文件--- " rm -rf $file else echo "---腳本未正常執行--- " fi # chmod 755 pass.sh # source pass.sh
d.在ansible主機配置hosts並複製至全部節點(另:請自行更改各節點hostname主機名)
# vim hosts 192.168.100.181 master1 192.168.100.182 master2 192.168.100.183 node01 192.168.100.184 node02 192.168.100.185 node03 # ansible all -m copy -a 'src=hosts dest=/etc/'
3.安裝cfssl並簽署證書
詳見https://github.com/zhijiansd/ansible-k8s下的「安裝cfssl並簽署證書」
4.安裝前準備
# curl -L https://storage.googleapis.com/etcd/v3.3.8/etcd-v3.3.8-linux-amd64.tar.gz -o /root/etcd-v3.3.8-linux-amd64.tar.gz # curl -L https://github.com/coreos/flannel/releases/download/v0.10.0/flannel-v0.10.0-linux-amd64.tar.gz -o flannel-v0.10.0-linux-amd64.tar.gz # wget https://storage.googleapis.com/kubernetes-release/release/v1.11.1/kubernetes-server-linux-amd64.tar.gz # tar -zxvf kubernetes-server-linux-amd64.tar.gz
注:下載的flannel、etcd、kubernetes皆位於/root/下
5.使用ansible-playbook命令部署集羣
# git clone https://github.com/zhijiansd/ansible-k8s.git # mkdir -pv /etc/ansible/roles/ # cp -R ansible-k8s/* /etc/ansible/roles/ # ansible-playbook k8s.yaml
6.查看集羣情況
# ansible 192.168.100.181 -a "etcdctl --endpoints=https://192.168.100.181:2379 ls /kube/network/subnets" 192.168.100.181 | SUCCESS | rc=0 >> /kube/network/subnets/10.244.95.0-24 /kube/network/subnets/10.244.72.0-24 /kube/network/subnets/10.244.62.0-24 # ansible 192.168.100.181 -a "kubectl get cs" 192.168.100.181 | SUCCESS | rc=0 >> NAME STATUS MESSAGE ERROR scheduler Healthy ok controller-manager Healthy ok etcd-1 Healthy {"health":"true"} etcd-4 Healthy {"health":"true"} etcd-0 Healthy {"health":"true"} etcd-3 Healthy {"health":"true"} etcd-2 Healthy {"health":"true"} # ansible 192.168.100.181 -a "kubectl get nodes" 192.168.100.181 | SUCCESS | rc=0 >> NAME STATUS ROLES AGE VERSION node01 Ready <none> 1h v1.11.1 node02 Ready <none> 1h v1.11.1 node03 Ready <none> 1h v1.11.1
7.與1.8和1.9的不一樣之處
A.kube-apiserver
--admission-control選項從1.10版開始更改成了--enable-admission-plugins,且順序可有可無
關於准入控制器詳見:
https://kubernetes.io/docs/reference/access-authn-authz/admission-controllers/
--insecure-bind-address選項如今已經取消,使用http的話,只能使用127.0.0.1:8080查看API
--secure-port,添加該選項,經過HTTPS提供服務的端口進行身份驗證和受權
--experimental-encryption-provider-config,如今添加了該選項,用以加密數據,控制API數據在etcd中的加密方式
關於加密數據詳見:
https://kubernetes.io/docs/tasks/administer-cluster/encrypt-data/
--kubelet-client-certificate和--kubelet-client-key,如今添加這兩項,經過安全的端口和kubelet進行通訊
--token-auth-file,這裏去掉了該項,在這裏咱們使用kubeadm命令爲每一個node分別生成token
B.kube-controller-manager
--address命令如今已經棄用,改用--bind-address命令
--allocate-node-cidrs=true和--service-cluster-ip-range提示說要一塊兒配置,可是--allocate-node-cidrs選項註釋爲是否在雲提供商上分配和設置Pod的CIDR,我這沒有上雲,因此不甚明瞭
--leader-elect=true,添加該選項以實現kube-controller-manager高可用,啓用選舉功能,被選爲 leader 的節點負責處理工做,其它節點爲阻塞狀態
--controllers=*,bootstrapsigner,tokencleaner,添加該選項,啓用控制器。「 * 」啓用全部默認控制器(默認禁用控制器:bootstrapsigner,tokencleaner)
--experimental-cluster-signing-duration,添加該選項,配置簽署證書的有效期(默認值8760h0m0s,即1年)
--kubeconfig,添加該選項,指定 kubeconfig 文件路徑,用來鏈接和驗證 kube-apiserver
--use-service-account-credentials=true ,若是爲true,請爲每一個控制器使用單獨的服務賬戶憑據
--feature-gates=RotateKubeletServerCertificate=true,開啓 kublet server 證書自動審批、更新特性
C.kube-scheduler
--leader-elect=true,添加該選項以實現kube-scheduler高可用,啓用選舉功能,被選爲 leader 的節點負責處理工做,其它節點爲阻塞狀態
--kubeconfig,添加該選項,指定 kubeconfig 文件路徑,用來鏈接和驗證 kube-apiserver
D.kubelet
--config,從1.10版開始,做爲命令行標誌的替代出現,經過該配置文件提供配置管理參數
關於kubelet-config配置,詳見
https://kubernetes.io/docs/tasks/administer-cluster/kubelet-config-file/
KubeletConfig中的一些選項:
authentication.x509.clientCAFile: 指定簽名客戶端證書的 CA 證書,開啓 HTTPS認證
authentication.webhook.enabled: 設置爲false,關閉 HTTPS bearer token 認證
authentication.anonymous.enabled: 設置爲 false,不容許匿名訪問 10250 端口
authroization.mode: Kubelet服務器的受權模式。有效選項是AlwaysAllow或Webhook。Webhook模式使用SubjectAcce***eview API來肯定受權。(默認爲「AlwaysAllow」,受權任何成功經過身份驗證的請求)
failSwapOn: 設置爲false,關閉對於開啓了swap的系統的限制
RotateCertificates: 設置爲true,當證書過時時,經過從kube-apiserver請求新證書來自動輪換kubelet客戶端證書
featureGates:
RotateKubeletClientCertificate: true
RotateKubeletServerCertificate: true
開啓自動輪換的特性
關於kubelet身份驗證/受權,詳見:
關於kubelet啓用和配置證書輪換,詳見:
https://kubernetes.io/docs/tasks/tls/certificate-rotation/
E.kube-proxy
--config,做爲命令行標誌的替代出現,如今處於alpha版本,之後可能會像kubelet同樣強制經過該配置文件提供配置管理參數
注意:在centos7下若是使用ipvs代理模式是有問題的,這是一個bug,詳見:
https://github.com/kubernetes/kubernetes/pull/65533
https://bugzilla.redhat.com/show_bug.cgi?id=1496859
https://bugzilla.redhat.com/show_bug.cgi?id=1557599
不過升級到4.x版內核可以使用ipvs。
KubeProxyConfig中的一些選項:
clientConnection.kubeconfig: 指定 kubeconfig 文件路徑,用來鏈接和驗證 kube-apiserver
8.如要移植使用,請參見https://github.com/zhijiansd/ansible-k8s下的「移植注意事項」更改。若是在安裝中有什麼問題能夠在GitHub上提issue,在博客下提問可能沒法關注到問題,但願能解答你的問題。
注:
該篇文章參考了kubelet的證書輪換,地址:https://github.com/opsnull/follow-me-install-kubernetes-cluster