kubernetes
應該怎么讀?
在裝kubernetes
之前,有必要了解下這個東西的發音。
斷句: koob-er-net-ees
音標:[kubə’netis]
音譯: 庫伯耐提斯
github上相關的討論: https://github.com/kubernetes/kubernetes/issues/44308
這部分內容參考了: kubernetes 如何發音?
系統准備
准備3台ubuntu系統(版本都是20.04及以上), 配置好代理, 網絡(互相之間可以ping通). 我這邊是有一台裝了ubuntu的物理主機和另外兩個在這個宿主上的通過vmware跑的ubuntu server虛擬機, 兩個虛擬機的網絡模式選擇橋接模式; 三台ubuntu都連到同一個路由器.
三台機子的ip地址:
# 主節點/控制節點 主機名: laplus
192.168.124.66
# 從節點1 主機名: laplus-1
192.168.124.9
# 從節點2 主機名: laplus-2
192.168.124.10
然后分別配置下三台機子的主機名, 方便辨認
打開/etc/hosts
文件, 分別加上
# ip為 192.168.124.66 ubuntu加上下面的內容
127.0.0.1 laplus
# ip為 192.168.124.9 ubuntu加上下面的內容
127.0.0.1 laplus-sub1
# ip為 192.168.124.10 ubuntu加上下面的內容
127.0.0.1 laplus-sub2
完成后就有三台主機名分別為laplus
, laplus-sub1
,laplus-sub2
的ubuntu, 其中laplus
這台會作為k8s主節點, laplus-sub1
和laplus-sub2
作為從節點. laplus
是我給這個集群起的一個名字😉.
kubernetes對配置要求:
- 每台機器2GB及以上內容
- 每台機器至少2核cpu
關於代理
沒有代理的話會可能會導致整個過程異常艱難, 所以一定要先配置好代理!
ubuntu
上要注意, 用sudo
執行命令時, 要加-E
參數才能使代理相關的環境變量生效, 也就是把sudo
改成sudo -E
.
容器運行時(container runtime) - Docker
kubernetes支持多種容器運行時(container runtime), 我當然用docker啦, 其他的暫時還沒怎么了解過.
官方安裝指南: https://docs.docker.com/engine/install/ubuntu/.
# 卸載舊版本(如果之前安裝過), 如果apt報錯 Unable to locate package 那也不礙事, 說明機器上沒有相關殘留
sudo apt remove docker docker-engine docker.io containerd runc
# 設置docker倉庫
sudo apt update -y && \
sudo apt install -y \
ca-certificates \
curl \
gnupg \
lsb-release
# 添加docker官方的GPG密鑰
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# 設置穩定版docker倉庫源
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 安裝docker
sudo apt update -y && sudo apt install docker-ce docker-ce-cli containerd.io -y
# 驗證安裝是否成功
docker -v
docker配置http代理
這一步一定不能跳過! 否則后面使用kubeadm init
命令初始化集群時會失敗!
首先, 使用systemctl status docker
命令查詢docker.service
文件的路徑, 在我的環境中它的文件路徑是/lib/systemd/system/docker.service
; 然后編輯這個文件, 添加如下內容:
[Unit]
...
[Service]
...
Environment="HTTP_PROXY=http://127.0.0.1:10809"
Environment="HTTPS_PROXY=http://127.0.0.1:10809"
Environment="NO_PROXY=localhost,127.0.0.0/8,192.168.0.0/16,10.0.0.0/8"
[Install]
WantedBy=multi-user.target
三台機器上每台都要進行安裝和配置.
禁用swap
划重點, 根據kubenertes的文檔, 安裝前必須要禁用swap
分區.
每台ubuntu都要進行禁用操作:
vim /etf/fstab
# 注釋掉文件中包含swap的那一行
# # /etc/fstab: static file system information.
# #
# # Use 'blkid' to print the universally unique # identifier for a
# # device; this may be used with UUID= as a more # robust way to name devices
# # that works even if disks are added and # removed. See fstab(5).
# #
# # <file system> <mount point> <type> # <options> <dump> <pass>
# # / was on /dev/sda2 during installation
# UUID=aa665d86-d779-4b3e-9893-743ae3ac0074 # / ext4 errors=remount-ro # 0 1
# # /boot/efi was on /dev/sda1 during installation
# UUID=13FE-4A60 /boot/efi vfat # umask=0077 0 1
# # /swapfile # none swap sw 0 0
# 然后重啟下
sudo shutdown -r now
防火牆
laplus-sub1
和laplus-sub2
不會暴露在公網, 所以直接關掉其上的防火牆, ubuntu上關防火牆命令是:
sudo systemctl disable ufw.service && sudo systemctl stop ufw.service
laplus
上按照我個人的習慣還是要開個防火牆的, 我習慣了用firewalld
, 所以先禁用ubuntu的ufw
, 然后安裝並啟用firewalld
, 相關命令如下:
# 禁用並關閉 ufw 這個服務
sudo systemctl disable ufw.service && \
sudo systemctl stop ufw.service
# 卸載 ufw
sudo apt remove ufw -y
# 啟動firewalld並將其設為開機后自動啟動, 同時開放 22 端口
sudo systemctl start firewalld && \
sudo firewall-cmd --zone=public --add-port=22/tcp --permanent && \
sudo firewall-cmd --zone=public --add-port=22/udp --permanent && \
sudo firewall-cmd --reload
划重點, 根據kubernetes的官方文檔, kubernetes的主節點需要開放6443
、2379-2380
、10250
、10259
、10257
這些端口
放行端口的指令:
# 6443 端口
sudo firewall-cmd --zone=public --add-port=6443/tcp --permanent && \
sudo firewall-cmd --zone=public --add-port=6443/udp --permanent
# 2379-2380 端口
sudo firewall-cmd --permanent --zone=public --add-port=2379-2380/tcp && \
sudo firewall-cmd --permanent --zone=public --add-port=2379-2380/udp
# 10250 端口
sudo firewall-cmd --zone=public --add-port=10250/tcp --permanent && \
sudo firewall-cmd --zone=public --add-port=10250/udp --permanent
# 10259 端口
sudo firewall-cmd --zone=public --add-port=10259/tcp --permanent && \
sudo firewall-cmd --zone=public --add-port=10259/udp --permanent
# 10257 端口
sudo firewall-cmd --zone=public --add-port=10257/tcp --permanent && \
sudo firewall-cmd --zone=public --add-port=10257/udp --permanent
# 之后使用ingress的話, 下面的端口也需要開放
sudo firewall-cmd --zone=public --add-port=10251-10255/tcp --permanent && \
sudo firewall-cmd --zone=public --add-port=10251-10255/udp --permanent && \
sudo firewall-cmd --zone=public --add-port=8472/tcp --permanent && \
sudo firewall-cmd --zone=public --add-port=8472/udp --permanent && \
sudo firewall-cmd --add-masquerade --permanent
# 如果之后想在控制節點訪問NodePort端口的話, 需要放行 30000-32767
sudo firewall-cmd --permanent --add-port=30000-32767/tcp
# 使配置生效
sudo firewall-cmd --reload
確保內核參數開啟net.bridge.bridge-nf-call-iptables
使用sysctl -a
查看全部內核參數值, 確保``的值為1
如果發現其值不是1, 使用 sysctl -w net.bridge.bridge-nf-call-iptables=1
命令, 將bridge-nf-call-iptables
的值設為1.
安裝kubeadm
kubelet
和kubectl
首先照例更新下apt
的包索引, 並安裝之后會用到的必要的工具
sudo -E apt-get update -y && \
sudo -E apt-get install -y apt-transport-https ca-certificates curl
下載Google雲公鑰:
sudo -E curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
添加kubernetes倉庫源:
echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
安裝kubelet
kubeadm
kubectl
:
sudo -E apt-get update -y && \
sudo -E apt-get install -y kubelet kubeadm kubectl && \
sudo -E apt-mark hold kubelet kubeadm kubectl
每台機器上都要執行上面的操作安裝好kubelet
kubeadm
kubectl
安裝完成后, kubelet
會一直處在重啟狀態.
主節點使用systemctl status kubelet
查看kubelet
運行狀態:
從節點使用systemctl status kubelet
查看kubelet
運行狀態:
配置cgroup
詳見文檔: Container runtimes
可以直接執行下面的命令
cat <<EOF | sudo tee /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF
sudo systemctl daemon-reload & \
sudo systemctl restart docker
這一步也不能跳過, 否則下面執行kubeadm init
命令時會失敗. 什么? 你問我怎么知道, 因為我一開始圖省事就跳過了啊😂, 然后我是怎么知道是這一步的問題的呢? 用journalctl -u kubelet.service | tail -n 20
看了下kubelet
的日志就知道了
通過kubeadm
初始化集群
主節點初始化:
sudo -E kubeadm init --control-plane-endpoint=192.168.124.66 \
--pod-network-cidr=10.244.0.0/16 \
--apiserver-advertise-address=192.168.124.66
執行成功后, 控制台會打印出相關信息, 告訴你如何把從節點加進來, 注意保存下相關內容.
主節點初始化完成后還需要安裝網絡插件, 我選擇的flannel.
安裝flannel
# 先執行
sudo bash -c "echo '199.232.96.133 raw.githubusercontent.com' >> /etc/hosts"
# 這會往hosts文件中加一條解析, 否則即使你配置了代理也無法下載 raw.githubusercontent.com 的內容! 真坑!
sudo -E curl -fsSlo ./kube-flannel.yml https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml & \
sudo -E kubectl apply -f kube-flannel.yml
從節點加入主節點:
sudo kubeadm join 192.168.124.66:6443 --token bp40hq.1snqrahs3ixraeh4 \
--discovery-token-ca-cert-hash sha256:b3169e035bcae40203afe63a0208d7df32d788c8b69b52bd9e8053606e32bc0b
完事后, 主節點執行下sudo kubectl get nodes
查看另外兩個節點有沒有成功加進來, 成功的話輸出應該像下面這樣:
非root
用戶不加sudo
的情況下使用kubectl
提示沒有權限怎么辦?
執行chmod 666 /etc/kubernetes/admin.conf
修改文件權限即可
執行后admin.conf
文件的權限就變成了rw-rw-rw
, 即所有用戶都有權對其進行讀寫, 生產環境最好不要這樣.
kubectl配置自動補全
官網文檔:Enable shell autocompletion
安裝配置bash-completion
運行type _init_completion
, 檢查系統中是否已經安裝了bash-completion
; 如果已經有了的話, 跳過此步即可; 如果沒有的話, 先安裝下bash-completion
(這個東西正常情況下應該是已經裝好了的)
運行下面的命令安裝bash-completion
sudo -E apt install bash-completion
然后在~/.bashrc
文件中添加:
source /usr/share/bash-completion/bash_completion
然后執行source ~/.bashrc
.
生成kubectl
自動完成腳本
~/.bashrc
中添加source <(kubectl completion bash)
echo 'source <(kubectl completion bash)' >>~/.bashrc
然后生成kubectl
自動完成腳本
kubectl completion bash >/etc/bash_completion.d/kubectl
最后執行source ~/.bashrc
命令即可享受自動補全的快樂了😉.
下集預告
- kubernetes實踐錄 - 跑一個私有nuget倉庫
Baget