起
kubernetes作爲PAAS雲的落地平臺已經不是新聞了,從2016年開始國內不少雲廠紛紛開始作二次研發,一些IT集團根據本身的業務需求,自研適合自身業務的容器編排平臺,包括不少大客戶的技術提供商,也在爲客戶的業務應用作平臺開發,可巧筆者當初就曾用ansible寫過k8s的自動部署腳本,這算是第一次接觸k8s。node
後來國內考CKA認證的技術人員愈來愈多,到我考的時候已經有5000多號人了,如今應該更多,CKA認證基本已經成爲從業人員的標配。儘管google也好,rancher也罷,包括不少雲廠商都有各自的部署工具,但CKA考試仍是要從開源版本學起,kubeadm是源生的部署工具,特別考試有一道8分的題,就是在裸機上用kubeadm部署k8s集羣。即使不考認證,若是你要從事容器雲的相關工做,我的認爲也應該從開源版本學起。linux
再到後來有幸成爲紅旗教育學院的k8s講師,想將部署操做k8s的內容作下梳理,故撰成此文。此爲第一回,先說部署,後續再慢慢加其它內容。docker
承
其實說到源生的K8s部署,剛開始應該先從源碼安裝開始,這個我也作過幾次,優勢是能快速熟悉kubernetes架構和組件構成和組件與組件以前的耦合關係。不過從易用性和可用性角度出發,不管是測試仍是上生產,我想基本都不會考慮, 費時費力還一堆坑,這個仍是留待大夥學習,或我哪天心情特別差的時候再說哈。因此第一回先從kubeadm部署k8s集羣開始。shell
小提示:kubernetes爲啥又叫k8s,是由於k與s之間有8個字母,國人的簡便稱謂。。。。。json
好,如今開始部署,首先要準備最起碼三臺設備,虛擬機也好,物理機也罷,這個隨便,建議配置以下:ubuntu
機器配置:2核CPU,8G內存,40G系統盤
系統:Ubuntu 16.04.6 LTS
機器數量:3臺 (master node01 node02)vim
固然了,你要說內存4G行不行,也能夠,一個測試沒必要要在這方面那麼嚴謹,至於爲啥要用Ubuntu,這是CNCF社區的建議版本,其實用centos也同樣。能把集羣跑起來就算得~centos
接下來開始基礎環境配置(3臺都要執行)
(其實這部分屬於Linux基礎配置,若是對Linux不熟請先自行補課,固然在評論區問我也能夠哈)api
(1) ### 修改配置靜態hostnamebash
hostnamectl set-hostname master1(node01,node02)
(2)### hosts表:
172.16.100.206 master
172.16.100.205 node01
172.16.100.204 node02
(3)### 關閉firewalld
ufw disable
(4)### 關閉SELinux
ubuntu默認關閉SELinux
(5)### 關閉swap
臨時關閉:swapoff -a
永久關閉:註釋掉/etc/fstab下的swap一行
若是使用swap會影響性能,通常建議關閉,固然你非要用也不是沒有辦法。
(6)### 更新apt包索引
apt-get update
這個是ubuntu比較方便的地方,隨時更新隨時新~~
(7)### 安裝軟件包
apt-get -y install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
這一步的做用是容許apt經過HTTPS使用存儲庫
(8)### 安裝add-apt-repository工具
apt-get -y install software-properties-common
(9)### 添加Docker的官方GPG密鑰
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
(10)### 添加穩定的存儲庫
add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
上兩步的是爲了安裝docker作準備
(11)### 查看Docker版本
apt-cache madison docker-ce
如今已經到19版本了,不過我測試仍是用的18.09.9
(12)### 安裝docker-ce=5:18.09.9~3-0~ubuntu-bionic
apt-get -y install docker-ce=5:18.09.9~3-0~ubuntu-xenial docker-ce-cli=5:18.09.9~3-0~ubuntu-xenial containerd.io
執行docker info進行驗證
(13)### 解決swap報錯
執行docker info命令在最後一層會出現:
WARNING: No swap limit support(操做系統下docker內存限制的警告)
執行命令,vim /etc/default/grub 添加或編輯GRUB_CMDLINE_LINUX行以添加這鍵值:
GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1 net.ifnames=0 vga=792 console=tty0 console=ttyS0,115200n8 noibrs"
更新grub並重啓機器
update-grub
reboot
(14)### 解決防火牆轉發策略問題
docker 在 1.13 版本以後,將系統iptables 中 FORWARD 鏈的默認策略設置爲 DROP,併爲鏈接到 docker0 網橋的容器添加了ACCEPT規則,
臨時解決辦法:
iptables -P FORWARD ACCEPT
永久解決辦法:
vim /lib/systemd/system/docker.service.
在[Service]下添加:ExecStartPost=/sbin/iptables -P FORWARD ACCEPT
(15)### 設置daemon.json
cat > /etc/docker/daemon.json <<EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": ["https://7bezldxe.mirror.aliyuncs.com/"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF
主要是配置docker的日誌和拉取鏡像源,registry-mirrorsr使用國內阿里雲的源,這很重要,由於若是不配置,默認的源要能***才能搞。
讀取配置並重啓服務
systemctl daemon-reload && systemctl restart docker.service
(16)### 安裝kubeadm、kubelet、kubectl
sudo apt-get update && sudo apt-get install -y apt-transport-https curl
sudo tee /etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
仍是同樣,kubernetes的源須要***,因此依然用阿里的源,其實搞了k8s才知道阿里雲作了不少貢獻。
默認安裝最高版
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
本鎖定版本
sudo apt-mark hold kubelet kubeadm kubectl
(17)###免密訪問(master節點)
ssh-keygen -t rsa
ssh-copy-id k8s-master
ssh-copy-id k8s-node01
ssh-copy-id k8s-node02
到此,基礎環境配置完成,接下來開始正式部署。
轉
狀況是這樣的,測試環境只有一個master,因此是single control-plane的集羣,在在master節點執行
(1)### 初始化control-plane節點
生成配置文件
kubeadm config print init-defaults > init-defaults.yaml
kubeadm工具提供部署k8s的默認配置,能夠輸出爲yaml文件,但須要修改。
文件中的鏡像源imageRepository爲
k8s.gcr.io
安裝時默認會從這個源下載鏡像,若是不***沒法下載,故可事先將其改成:
registry.cn-hangzhou.aliyuncs.com/google_containers
在networking下修改clusterName(集羣名稱),修改apiservice地址
localAPIEndpoint:
advertiseAddress: 172.16.100.206
clusterName: cluster01
(2)### 執行初始化操做
kubeadm init --config=init-defaults.yaml
或者
kubeadm init \
--kubernetes-version=v1.18.0 \
--apiserver-advertise-address=172.16.100.206
部署如今k8s的最新版1.18.0,執行初始化操做時會先下載鏡像,也能夠先下載再部署。
列出需下載鏡像列表
kubeadm config images list
拉取鏡像到本地
kubeadm config images pull
(3)###初始化完成後立刻須要作的
執行完初始化後,會有提示如何添加worker節點,與集羣管理員賬戶配置。
集羣管理員賬戶配置:
root用戶
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> /root/.bashrc
source /root/.bashrc
非root用戶
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
注意,將添加worker節點命令保存,例如:
kubeadm join 172.16.100.206:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:a84eff9fe6cb5b9b01326b8790f86d73d59b99d124cdc8d8eb8d0208aeaeb905
(4)###檢查集羣
檢查組件狀態是否正常
kubectl get componentstatuses
查看集羣系統信息
kubectl cluster-info
檢查支撐集羣運行全部組件
kubectl -n kube-system get all
這些都是集羣初始化完成後的基本操作,至此初始化集羣完成,接下來開始配置集羣。
結
初始化完成且,須要對集羣作配置才能夠投入使用
(1)###自動補全
爲何先作它,是由於懶的緣由,這步操做能夠將kubectl命令,全部參數用tab健補全,就像Linux同樣:)
首先,取消bash-completion註釋
vim /etc/bash.bashrc
enable bash completion in interactive shells
if ! shopt -oq posix; then
if [ -f /usr/share/bash-completion/bash_completion ]; then
. /usr/share/bash-completion/bash_completion
elif [ -f /etc/bash_completion ]; then
. /etc/bash_completion
fi
fi
source /etc/bash.bashrc
第二步是查看completion幫助
kubectl completion -h
可獲取自動補全的命令
source <(kubectl completion bash)
若是執行一遍只是當前可用,再登錄就不行了。
將kubectl自動補全添加到配置文件中,能夠在之後的shell中自動加載
echo "source <(kubectl completion bash)" >> ~/.bashrc
source ~/.bashrc
(2)###配置網絡
kubectl apply -f https://docs.projectcalico.org/v3.8/manifests/calico.yaml
注,在集羣部署結束後,kube-system命名空間內集羣運行所需的全部控制器與POD,其中coredns是未running狀態,須要安裝網絡插件才能running,此步要在添加節點前執行。
(3)###添加work節點
登錄兩臺work節點,分別執行集羣初始化完成時保存的內容,例如:
kubeadm join 172.16.100.206:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:a84eff9fe6cb5b9b01326b8790f86d73d59b99d124cdc8d8eb8d0208aeaeb905
若是沒保存,能夠用命令生成再執行
建立token
kubeadm token create
查看token
kubeadm token list
獲取discovery-token-ca-cert-hash值
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
檢查集羣節點
kubectl get node
若是出現三臺節點都是ready狀態,即表示成功,以下所示:
NAME STATUS ROLES AGE VERSION
k8s-master Ready master 23h v1.18.2
k8s-node01 Ready <none> 23h v1.18.2
k8s-node02 Ready <none> 23h v1.18.2
###從新初始化
若是部署遇到問題或報錯,須要從新初始化
kubeadm reset
注,master與work節點都要執行
至此,k8s集羣部署完成,不少人都說誰也沒法保證kubeadm能一次部署成功。基本上照着作的話成功率仍是很高的,若是能出現節點狀態都ready的話,就能夠用了。
不過這裏我只寫了操做,說實話想着沒啥,可寫起來這麼老多,還牽扯不少k8s組件的運行原理和概念沒說,大夥要是看着還行,能夠留言討論,請期待下回,謝謝。