查看安裝 kubeadm-準備工作 對 k8s 安裝的基本要求:
- 一臺兼容的 Linux 主機。Kubernetes 項目為基于 Debian 和 Red Hat 的 Linux 發(fā)行版以及一些不提供包管理器的發(fā)行版提供通用的指令
- 每臺機器 2 GB 或更多的 RAM (如果少于這個數(shù)字將會影響你應(yīng)用的運行內(nèi)存)
- 2 CPU 核或更多
- 集群中的所有機器的網(wǎng)絡(luò)彼此均能相互連接(公網(wǎng)和內(nèi)網(wǎng)都可以)
- 節(jié)點之中不可以有重復的主機名、MAC 地址或 product_uuid。請參見這里了解更多詳細信息雏掠。
- 開啟機器上的某些端口疮鲫。請參見這里 了解更多詳細信息夺谁。
- 禁用交換分區(qū)利术。為了保證 kubelet 正常工作,你 必須 禁用交換分區(qū)灸叼。
部署準備工作
(整個部署環(huán)境全在virtualbox中實現(xiàn))
部署最小化 K8S 集群:master + node1 + node2
圖中是預(yù)先準備好的 3 臺虛擬機神汹,Debian安裝參考Debian11安裝簡述。
虛擬機基本配置是:2G內(nèi)存+2核CPU+20G磁盤空間古今。
設(shè)置k8s環(huán)境準備條件(所有機器)
3臺主機IP分別為 192.168.36.213
屁魏、192.168.36.141
、192.168.36.188
捉腥、氓拼,將起配置到 文件中,保證互相合一通:
以下使用 master 節(jié)點進行演示查看但狭,其他節(jié)點操作均一致
基礎(chǔ)信息配置
# 修改主機名稱披诗,保證節(jié)點主機名不重復
www@debian:~$ sudo hostnamectl set-hostname k8s-master
www@debian:~$ hostname # 查看修改結(jié)果
k8s-master
# 配置 hosts 文件
www@k8s-master:~$ cat <<EOF | sudo tee /etc/hosts
192.168.36.213 k8s-master
192.168.36.141 k8s-node1
192.168.36.188 k8s-node2
EOF
# 互相 ping 通
www@k8s-master:~$ ping 192.168.36.188
PING 192.168.36.188 (192.168.36.188) 56(84) bytes of data.
64 bytes from 192.168.36.188: icmp_seq=1 ttl=64 time=0.511 ms
64 bytes from 192.168.36.188: icmp_seq=2 ttl=64 time=0.323 ms
# 禁用交換分區(qū)
www@k8s-master:~$ sudo swapoff -a
# 永久禁用,打開/etc/fstab注釋掉swap那一行立磁。
www@k8s-master:~$ sed -i 's/.*swap.*/#&/' /etc/fstab
# 設(shè)置系統(tǒng)時區(qū)為中國/上海(同步系統(tǒng)時區(qū))
www@k8s-master:~$ sudo timedatectl set-timezone Asia/Shanghai
允許 iptables 檢查橋接流量
確保 br_netfilter
模塊被加載呈队。這一操作可以通過運行 lsmod | grep br_netfilter
來完成。若要顯式加載該模塊唱歧,可執(zhí)行 sudo modprobe br_netfilter
宪摧。
為了讓你的 Linux 節(jié)點上的 iptables 能夠正確地查看橋接流量,你需要確保在你的 sysctl
配置中將 net.bridge.bridge-nf-call-iptables
設(shè)置為 1
:
www@k8s-master:~$ cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF
www@k8s-master:~$ cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
www@k8s-master:~$ sudo sysctl --system
安裝 Docker
安裝 kubeadm颅崩、kubelet 和 kubectl
參考 安裝-kubeadm-kubelet-和-kubectl
- 更新
apt
包索引并安裝使用 Kubernetesapt
倉庫所需要的包:
www@k8s-master:~$ sudo apt-get update
www@k8s-master:~$ sudo apt-get install -y apt-transport-https ca-certificates curl
- 下載 kubernetes 簽名秘鑰:
由于官方 k8s 源在 google几于,國內(nèi)無法訪問,這里使用阿里云yum源
www@k8s-master:~$ curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
- 添加 Kubernetes
apt
倉庫:
www@k8s-master:~$ cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
- 更新
apt
包索引沿后,安裝 kubelet沿彭、kubeadm 和 kubectl,并鎖定其版本:
www@k8s-master:~$ sudo apt-get update
www@k8s-master:~$ sudo apt-get install -y kubelet kubeadm kubectl
防止版本誤差太大出問題尖滚,鎖定版本
www@k8s-master:~$ sudo apt-mark hold kubelet kubeadm kubectl
添加開機啟動
www@k8s-master:~$ sudo systemctl enable kubelet.service
www@k8s-master:~$ sudo systemctl start kubelet.service
---------------以上使用 master 節(jié)點進行演示查看喉刘,其他節(jié)點操作均一致--------------------
部署 kubernetes Master
在 master(192.168.36.213)節(jié)點上執(zhí)行:
kubeadm init
命令參考
- --kubernetes-version — 制定當前 kubernetes 版本
- --image-repository — 選擇用于拉取控制平面鏡像的容器倉庫
- apiserver-advertise-address — API 服務(wù)器所公布的其正在監(jiān)聽的 IP 地址,即 Master 主機地址
- --service-cidr — 為服務(wù)的虛擬 IP 地址另外指定 IP 地址段漆弄,默認值:"10.96.0.0/12"
- --pod-network-cidr — 指明 pod 網(wǎng)絡(luò)可以使用的 IP 地址段睦裳。如果設(shè)置了這個參數(shù),控制平面將會為每一個節(jié)點自動分配 CIDRs撼唾。
www@k8s-master:~$ sudo kubeadm init \
--kubernetes-version=1.23.1 \
--image-repository registry.aliyuncs.com/google_containers \
--apiserver-advertise-address=192.168.36.213 \
--service-cidr=10.245.0.0/12 \
--pod-network-cidr=10.244.0.0/16
上面安裝完后廉邑,會提示你輸入如下命令,按順序執(zhí)行即可倒谷。
Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Alternatively, if you are the root user, you can run:
export KUBECONFIG=/etc/kubernetes/admin.conf
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 192.168.36.213:6443 --token vhglgq.vunh0rsxz8nlzcd1 \
--discovery-token-ca-cert-hash sha256:e0f8afa923d79d6da38394b0e9fbdb70cd9c67d86df39487146d406bb023a42b
在 ndoe 節(jié)點分別執(zhí)行這個命令:
www@k8s-master:~$ sudo kubeadm join 192.168.36.213:6443 --token vhglgq.vunh0rsxz8nlzcd1 \
--discovery-token-ca-cert-hash sha256:e0f8afa923d79d6da38394b0e9fbdb70cd9c67d86df39487146d406bb023a42b
默認 token
有效期為24小時蛛蒙,當過期之后,該token就不可用了渤愁。這時就需要重新創(chuàng)建 token
宇驾,操作如下:
www@k8s-master:~$ sudo kubeadm token create --print-join-command
上述操作成功之后回到 Master 節(jié)點,運行 kubectl get nodes
命令查看:
www@k8s-master:~$ sudo kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master NotReady control-plane,master 4m56s v1.23.1
k8s-node1 NotReady <none> 13s v1.23.1
k8s-node2 NotReady <none> 21s v1.23.1
安裝 CNI 網(wǎng)絡(luò)插件
此時猴伶,雖然 Maste 節(jié)點可以檢測到 node 節(jié)點课舍,但 STATUS 都還是 NotReady 狀態(tài)塌西,這里需要看裝 CNI節(jié)點來實現(xiàn)網(wǎng)絡(luò)訪問。Kubernetes 的網(wǎng)絡(luò)模型選擇:
- 安裝 calico 插件
# 這里選擇的是 calico 插件
www@debian:~$ sudo kubectl apply -f https://docs.projectcalico.org/v3.20/manifests/calico.yaml
- 驗證結(jié)果
www@debian:~$ sudo kubectl get pods --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system calico-kube-controllers-7c8984549d-pt78g 1/1 Running 0 24m
kube-system calico-node-jkbvn 1/1 Running 0 24m
kube-system calico-node-txj79 1/1 Running 0 24m
kube-system calico-node-vm8wm 1/1 Running 0 24m
kube-system coredns-6d8c4cb4d-7bz8d 1/1 Running 0 17h
kube-system coredns-6d8c4cb4d-w2qbx 1/1 Running 0 17h
kube-system etcd-k8s-master 1/1 Running 2 (13h ago) 17h
kube-system kube-apiserver-k8s-master 1/1 Running 2 (13h ago) 17h
kube-system kube-controller-manager-k8s-master 1/1 Running 2 (13h ago) 17h
kube-system kube-proxy-5brbs 1/1 Running 1 (13h ago) 17h
kube-system kube-proxy-dmg62 1/1 Running 1 (13h ago) 17h
kube-system kube-proxy-rc6ww 1/1 Running 1 (13h ago) 17h
kube-system kube-scheduler-k8s-master 1/1 Running 2 (13h ago) 17h
- 再次運行
kubectl get nodes
命令查看節(jié)點狀態(tài):
www@k8s-master:~$ sudo kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master Ready control-plane,master 17h v1.23.1
k8s-node1 Ready <none> 17h v1.23.1
k8s-node2 Ready <none> 17h v1.23.1
各個節(jié)點狀態(tài)已就緒
測試 kubernetes 集群
- 拉取一個nginx鏡像筝尾,并創(chuàng)建 nginx Pod
www@k8s-master:~$ sudo kubectl create deployment nginx --image=nginx
- 查看 nginx Pod 狀態(tài):當 STATUS 為
Running
即表示創(chuàng)建完成
www@k8s-master:~$ sudo kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-85b98978db-gszf4 0/1 ContainerCreating 0 37s
www@k8s-master:~$ sudo kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-85b98978db-gszf4 1/1 Running 0 4m28s
- 對外暴露 nginx 端口
www@k8s-master:~$ sudo kubectl expose deployment nginx --port=80 --type=NodePort
service/nginx exposed
- 查看對外暴露端口狀態(tài)
www@k8s-master:~$ sudo kubectl get pod,svc
NAME READY STATUS RESTARTS AGE
pod/nginx-85b98978db-gszf4 1/1 Running 0 8m55s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.240.0.1 <none> 443/TCP 18h
service/nginx NodePort 10.255.117.143 <none> 80:32224/TCP 107s
- 在外網(wǎng)中以任一 node(
192.168.36.141
捡需、192.168.36.188
) 節(jié)點加上對外暴露端口32224
訪問可以看到如下結(jié)果:
至此,一個簡單的 k8s 集群系統(tǒng)安裝筹淫、測試完成站辉。