kubeadm
minikube 還是太“迷你”了,方便的同時也隱藏了很多細節,離真正生產環境里的計算集群有一些差距,畢竟許多需求、任務只有在多節點的大集群里才能夠遇到,相比起來,minikube 真的只能算是一個“玩具”。
Kubernetes 是很多模塊構成的,而實現核心功能的組件像 apiserver、etcd、scheduler 等本質上都是可執行文件,所以也可以采用和其他系統差不多的方式,使用 Shell 腳本或者 Ansible 等工具打包發布到服務器上。
不過 Kubernetes 里的這些組件的配置和相互關系實在是太復雜了,用 Shell、Ansible 來部署的難度很高,需要具有相當專業的運維管理知識才能配置、搭建好集群,而且即使這樣,搭建的過程也非常麻煩。
為了簡化 Kubernetes 的部署工作,讓它能夠更“接地氣”,社區里就出現了一個專門用來在集群中安裝 Kubernetes 的工具,名字就叫“kubeadm”,意思就是“Kubernetes 管理員”。
下面使用kubeadm搭建一個1master,1work ,1console的k8s集群
安裝前的準備工作
改主機名
由于 Kubernetes 使用主機名來區分集群里的節點,所以每個節點的 hostname 必須不能重名。你需要修改“/etc/hostname”這個文件,把它改成容易辨識的名字,比如 Master 節點就叫 master,Worker 節點就叫 worker:
sudo vi /etc/hostname
改 Docker 配置
安裝完成docker后需要你再對 Docker 的配置做一點修改,在“/etc/docker/daemon.json”里把 cgroup 的驅動程序改成 systemd ,然后重啟 Docker 的守護進程
cat <<EOF | sudo tee /etc/docker/daemon.json
{"registry-mirrors": ["https://5pfmrxk8.mirror.aliyuncs.com"],"exec-opts": ["native.cgroupdriver=systemd"],"log-driver": "json-file","log-opts": {"max-size": "100m"},"storage-driver": "overlay2"
}
EOFsudo systemctl enable docker
sudo systemctl daemon-reload
sudo systemctl restart docker
改網絡設置
為了讓 Kubernetes 能夠檢查、轉發網絡流量,你需要修改 iptables 的配置,啟用“br_netfilter”模塊:
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOFcat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward=1 # better than modify /etc/sysctl.conf
EOFsudo sysctl --system
改交換分區
需要修改“/etc/fstab”,關閉 Linux 的 swap 分區,提升 Kubernetes 的性能:
sudo swapoff -a
sudo sed -ri '/\sswap\s/s/^#?/#/' /etc/fstab
完成之后,最好記得重啟一下系統,然后給虛擬機拍個快照做備份,避免后續的操作失誤導致重復勞動。
安裝 kubeadm
在 Master 節點和 Worker 節點上都要安裝
1、添加 kubeadm 的國內庫
官方 Google Cloud 庫可能網速慢下載不下來
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
exclude=kube*
EOF
2、安裝、更新所需的軟件包
# 安裝所需的軟件包
sudo yum install -y yum-utils device-mapper-persistent-data lvm2# 添加 Kubernetes 軟件包倉庫
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/# 更新 yum 軟件包索引
sudo yum update -y
3、安裝 kubeadm, kubelet, 和 kubectl 指定版本(1.23.3)
sudo yum install -y kubelet-1.23.3 kubeadm-1.23.3 kubectl-1.23.3
4、查看版本
kubeadm version
kubectl version --client
5、標記 kubelet 包不自動更新
# 安裝 yum-plugin-versionlock 插件
sudo yum install yum-plugin-versionlock
#使用命令 apt-mark hold ,鎖定這三個軟件的版本
sudo apt-mark hold kubeadm kubelet kubectl
#或者 將軟件包添加到版本鎖定列表中
sudo yum versionlock add kubeadm kubelet kubectl
安裝 Master 節點
kubeadm 的用法非常簡單,只需要一個命令 kubeadm init 就可以把組件在 Master 節點上運行起來,不過它還有很多參數用來調整集群的配置,可以用 -h 查看。
常用的 3 個參數:
- –pod-network-cidr,設置集群里 Pod 的 IP 地址段。
- –apiserver-advertise-address,設置 apiserver 的 IP 地址,對于多網卡服務器來說很重要(比如 VirtualBox 虛擬機就用了兩塊網卡),可以指定 apiserver 在哪個網卡上對外提供服務。
- –kubernetes-version,指定 Kubernetes 的版本號。
1、初始化kubernetes集群
指定了 Pod 的地址段是“10.244.0.0/16”,service的地址是 10.96.0.0/12 ,apiserver 的服務地址是“自己機器的ip”,Kubernetes 的版本號是“1.23.3”
kubeadm init \
--apiserver-advertise-address=本身的虛擬機ip \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.23.3 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16
2、建立“.kube”目錄
To start using your cluster, you need to run the following as a regular user:mkdir -p $HOME/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/config
在本地建立一個“.kube”目錄,然后拷貝 kubectl 的配置文件,你只要原樣拷貝粘貼就行。
3、保存kubeadm join 信息
kubeadm join 172.16.*.*:6443 --token fnbir9.g81u885fcu8jvbji \--discovery-token-ca-cert-hash sha256:77423363c190a976de43ebe4e06bf90e35fdf918bda7ac995392714f0895c9de
其他節點要加入集群必須要用指令里的 token 和 ca 證書,所以這條命令務必拷貝后保存好:
token默認只有24個小時,如果過期了或者忘了,可以重新獲取加入集群的命令
kubeadm token create --print-join-command
4、檢查 Kubernetes 集群的節點狀態
kubectl version
kubectl get node
Master 節點的狀態是“NotReady”,這是由于還缺少網絡插件,集群的內部網絡還沒有正常運作。
安裝 Flannel 網絡插件
使用項目的“kube-flannel.yml”在 Kubernetes 里部署一下就好了。不過因為它應用了 Kubernetes 的網段地址,需要修改文件里的“net-conf.json”字段,把 Network 改成剛才 kubeadm 的參數 --pod-network-cidr 設置的地址段。
kube-flannel.yml文件地址
1、kube-flannel.yml內容
apiVersion: v1
kind: Namespace
metadata:labels:k8s-app: flannelpod-security.kubernetes.io/enforce: privilegedname: kube-flannel
---
apiVersion: v1
kind: ServiceAccount
metadata:labels:k8s-app: flannelname: flannelnamespace: kube-flannel
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:labels:k8s-app: flannelname: flannel
rules:
- apiGroups:- ""resources:- podsverbs:- get
- apiGroups:- ""resources:- nodesverbs:- get- list- watch
- apiGroups:- ""resources:- nodes/statusverbs:- patch
- apiGroups:- networking.k8s.ioresources:- clustercidrsverbs:- list- watch
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:labels:k8s-app: flannelname: flannel
roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: flannel
subjects:
- kind: ServiceAccountname: flannelnamespace: kube-flannel
---
apiVersion: v1
data:cni-conf.json: |{"name": "cbr0","cniVersion": "0.3.1","plugins": [{"type": "flannel","delegate": {"hairpinMode": true,"isDefaultGateway": true}},{"type": "portmap","capabilities": {"portMappings": true}}]}net-conf.json: |{"Network": "10.244.0.0/16","Backend": {"Type": "vxlan"}}
kind: ConfigMap
metadata:labels:app: flannelk8s-app: flanneltier: nodename: kube-flannel-cfgnamespace: kube-flannel
---
apiVersion: apps/v1
kind: DaemonSet
metadata:labels:app: flannelk8s-app: flanneltier: nodename: kube-flannel-dsnamespace: kube-flannel
spec:selector:matchLabels:app: flannelk8s-app: flanneltemplate:metadata:labels:app: flannelk8s-app: flanneltier: nodespec:affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- key: kubernetes.io/osoperator: Invalues:- linuxcontainers:- args:- --ip-masq- --kube-subnet-mgrcommand:- /opt/bin/flanneldenv:- name: POD_NAMEvalueFrom:fieldRef:fieldPath: metadata.name- name: POD_NAMESPACEvalueFrom:fieldRef:fieldPath: metadata.namespace- name: EVENT_QUEUE_DEPTHvalue: "5000"image: docker.io/flannel/flannel:v0.25.1name: kube-flannelresources:requests:cpu: 100mmemory: 50MisecurityContext:capabilities:add:- NET_ADMIN- NET_RAWprivileged: falsevolumeMounts:- mountPath: /run/flannelname: run- mountPath: /etc/kube-flannel/name: flannel-cfg- mountPath: /run/xtables.lockname: xtables-lockhostNetwork: trueinitContainers:- args:- -f- /flannel- /opt/cni/bin/flannelcommand:- cpimage: docker.io/flannel/flannel-cni-plugin:v1.4.0-flannel1name: install-cni-pluginvolumeMounts:- mountPath: /opt/cni/binname: cni-plugin- args:- -f- /etc/kube-flannel/cni-conf.json- /etc/cni/net.d/10-flannel.conflistcommand:- cpimage: docker.io/flannel/flannel:v0.25.1name: install-cnivolumeMounts:- mountPath: /etc/cni/net.dname: cni- mountPath: /etc/kube-flannel/name: flannel-cfgpriorityClassName: system-node-criticalserviceAccountName: flanneltolerations:- effect: NoScheduleoperator: Existsvolumes:- hostPath:path: /run/flannelname: run- hostPath:path: /opt/cni/binname: cni-plugin- hostPath:path: /etc/cni/net.dname: cni- configMap:name: kube-flannel-cfgname: flannel-cfg- hostPath:path: /run/xtables.locktype: FileOrCreatename: xtables-lock
修改net-conf.json:
如果不是10.244.0.0/16,net-conf.json修改成“自己設置的pod網段”:
net-conf.json: |{"Network": "自己設置的pod網段","Backend": {"Type": "vxlan"}}
2、啟動Flannel插件
#創建文件
touch kube-flannel.yml
#編輯文件,將修改過的內容copy進去
vim kube-flannel.yml
#生成插件pod
kubectl apply -f kube-flannel.yml
kube-flannel.yml默認就是“10.244.0.0/16”,可以直接使用下面命令:
kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
3、查看Flannel插件是否正常運行
#查看DaemonSet是否正常運行
#如果kube-flannel-ds的副本數顯示為1/1,則表示DaemonSet正在正常運行
kubectl get daemonset -n kube-system
#檢查kube-flannel的Pod是否正常運行
#如果輸出顯示Pod的狀態為Running,則表示kube-flannel插件正在正常運行。
kubectl get pods -n kube-system -l app=flannel#檢查kube-flannel的日志以查找任何錯誤
#查看日志是否顯示任何錯誤或警告信息。
kubectl logs -n kube-system <kube-flannel-pod-name>
4、查看集群節點狀態
kubectl get node
Master 節點的狀態是“Ready”,表明節點網絡也工作正常了
安裝 Worker 節點
1、安裝前置操作
把準備工作配置和kubeadm安裝好
2、執行kubeadm join
只需要用之前拷貝的那條 kubeadm join 命令就可以了,用 sudo 來執行:
sudo \
kubeadm join 172.16.*.*:6443 --token fnbir9.g81u885fcu8jvbji \--discovery-token-ca-cert-hash sha256:77423363c190a976de43ebe4e06bf90e35fdf918bda7ac995392714f0895c9de
3、查看節點狀態
kubectl get node
發現還是NotReady狀態
4、復制配置文件
遠程復制
sudo scp -r root@*.*.*.*:/etc/kubernetes/admin.conf /etc/kubernetes/admin.confmkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
手動復制
mkdir -p $HOME/.kube
#把/etc/kubernetes/admin.conf文件copy到本機,再執行命令
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
再次查看節點狀態,變成ready
安裝Console
可以節點本身充當Console(就是不用單獨安裝)
1、安裝kubectl
# 下載:
curl -LO https://dl.k8s.io/release/v1.23.3/bin/linux/arm64/kubectl# 安裝
sudo install kubectl /usr/local/bin/kubectl# 從master節點復制文件sudo scp stark@192.168.88.134:/etc/kubernetes/admin.conf /etc/kubernetes/admin.conf
2、 從master節點復制文件
遠程復制
sudo scp -r root@*.*.*.*:/etc/kubernetes/admin.conf /etc/kubernetes/admin.confmkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
手動復制
mkdir -p $HOME/.kube
#把/etc/kubernetes/admin.conf文件copy到本機,再執行命令
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
測試集群
在console節點是執行kubectl run ,運行 Nginx 來測試一下:
kubectl run ngx --image=nginx:alpine
kubectl get pod -o wide
會發現,pod被調度到了work節點上運行