kubernetes實踐錄 - 在ubuntu上搭建k8s集群


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-sub1laplus-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-sub1laplus-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的主節點需要開放64432379-2380102501025910257這些端口

image

放行端口的指令:

# 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

image

如果發現其值不是1, 使用 sysctl -w net.bridge.bridge-nf-call-iptables=1 命令, 將bridge-nf-call-iptables的值設為1.

安裝kubeadm kubeletkubectl

首先照例更新下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運行狀態:
image

從節點使用systemctl status kubelet查看kubelet運行狀態:
image

配置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查看另外兩個節點有沒有成功加進來, 成功的話輸出應該像下面這樣:

image

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM