使用ansible安裝kubernetes 1.11.1

1.規劃
node

  •  Masterlinux

            192.168.100.181git

            192.168.100.182github


  • Nodeweb

            192.168.100.183bootstrap

            192.168.100.184vim

            192.168.100.185centos



  • VIPapi

  •     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.2haproxy-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身份驗證/受權,詳見:

https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet-authentication-authorization/#overview

關於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

相關文章
相關標籤/搜索