資源 | 大小 |
---|---|
硬碟 | >= 20G |
cpu | >= 2核 |
記憶體 | >= 2G |
主機名 | IP | 設定 |
---|---|---|
master | 192.168.10.155 | 3核+2G+20G |
worker1 | 192.168.10.234 | 3核+2G+20G |
worker2 | 192.168.10.147 | 3核+2G+20G |
所有機器都要執行
yum 更新
sudo yum update -y
sudo yum install -y bash-completion wget vim-enhanced net-tools gcc
hostname
以下三條命令分別在三個節點執行
#master節點
hostnamectl set-hostname k8s-master
#worker1節點
hostnamectl set-hostname k8s-worker1
#woker2節點
hostnamectl set-hostname k8s-worker2
將節點加入到 hosts 檔案中
編輯/etc/hosts
檔案
vi /etc/hosts
新增以下內容
192.168.10.155 k8s-master
192.168.10.234 k8s-worker1
192.168.10.147 k8s-worker2
sudo yum -y install ntpdate
sudo ntpdate ntp1.aliyun.com
sudo systemctl status ntpdate
sudo systemctl start ntpdate
sudo systemctl status ntpdate
sudo systemctl enable ntpdate
這裡使用關閉防火牆
sudo systemctl stop firewalld.service
sudo systemctl disable firewalld.service
#檢視
free -h
#臨時關閉swap
sudo swapoff -a
#久關閉swap分割區
sudo sed -i 's/.*swap.*/#&/' /etc/fstab
#檢視
getenforce
cat /etc/selinux/config
#臨時關閉
sudo setenforce 0
#永久關閉
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
# 刪除 docker(如果有的話)
sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
# 安裝必備工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# 加入 docker 源
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 安裝 docker
sudo yum install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
# 安裝 containerd
sudo yum install -y containerd
# 停止 containerd
sudo systemctl stop containerd.service
# 生成並修改組態檔
sudo cp /etc/containerd/config.toml /etc/containerd/config.toml.bak
sudo containerd config default > $HOME/config.toml
sudo cp $HOME/config.toml /etc/containerd/config.toml
sudo sed -i "s#registry.k8s.io/pause#registry.cn-hangzhou.aliyuncs.com/google_containers/pause#g" /etc/containerd/config.toml
sudo sed -i "s#SystemdCgroup = false#SystemdCgroup = true#g" /etc/containerd/config.toml
# 將 containerd 加入開機自啟
sudo systemctl enable --now containerd.service
# 啟動 docker
sudo systemctl start docker.service
# 將 docker 加入開機自啟
sudo systemctl enable docker.service
sudo systemctl enable docker.socket
sudo systemctl list-unit-files | grep docker
sudo systemctl daemon-reload
sudo systemctl restart docker
sudo docker info
sudo systemctl status docker.service
sudo systemctl status containerd.service
新增/etc/yum.repos.d/kubernetes.repo
檔案;檔案內容如下
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
# 是否開啟本倉庫
enabled=1
# 是否檢查 gpg 簽名檔案
gpgcheck=0
# 是否檢查 gpg 簽名檔案
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
sudo mkdir -p /etc/docker
vi /etc/docker/daemon.json
/etc/docker/daemon.json
檔案新增如下內容
{
"registry-mirrors": [
"https://dockerproxy.com",
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com",
"https://ccr.ccs.tencentyun.com"
],
"exec-opts": ["native.cgroupdriver=systemd"]
}
cat >/etc/modules-load.d/k8s.conf <<EOF
overlay
br_netfilter
EOF
modprobe overlay
modprobe br_netfilter
cat >/etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
EOF
sysctl --system
# 通過執行以下指令確認br_netfilter和overlay模組被載入
lsmod | egrep 'overlay|br_netfilter'
# 通過執行以下指令確認net.bridge.bridge-nf-call-iptables、net.bridge.bridge-nf-call-ip6tables系統變數在你的sysctl設定中被設定為1
sysctl net.bridge.bridge-nf-call-iptables net.bridge.bridge-nf-call-ip6tables net.ipv4.ip_forward
# 安裝 1.27.1 版本
sudo yum install -y kubelet-1.27.1-0 kubeadm-1.27.1-0 kubectl-1.27.1-0 --disableexcludes=kubernetes --nogpgcheck
systemctl daemon-reload
sudo systemctl restart kubelet
sudo systemctl enable kubelet
安裝最新版本(生產環境不建議)
sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes --nogpgcheck
kubeadm init --image-repository=registry.aliyuncs.com/google_containers --apiserver-advertise-address=192.168.42.150 --kubernetes-version=v1.27.1
--image-repository
: 映象加速地址,一般不動
--apiserver-advertise-address
: master節點IP地址
--kubernetes-version
: kubernetes版本,自己選擇的什麼版本就改成什麼版本
初始化失敗可以使用kubeadm reset
重置;失敗原因多半是因為網路問題,可以換個網路試試
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
kubeadm init
命令執行成功後,會列印以下內容 (不要直接複製,每個人不一樣):
kubeadm join 192.168.10.155:6443 --token pn5997.vkugw8cmdpc407y2 \
--discovery-token-ca-cert-hash sha256:b625d6be2a3ccb56f3277e835b343d33a0b2e93e56e238a48daf830d3b7219f2
如果忘記或者過期可以使用以下命令重新生成
kubeadm token create --print-join-command
kubectl get nodes
輸出
NAME STATUS ROLES AGE VERSION
k8s-master NotReady control-plane 8m42s v1.27.1
k8s-worker1 NotReady <none> 82s v1.27.1
k8s-worker2 NotReady <none> 84s v1.27.1
可以看到所有節點都是 NotReady ,是因為還沒有設定網路
k8s版本要與Calico版本對應上,具體檢視
https://docs.tigera.io/calico/latest/getting-started/kubernetes/requirements
下載calico.yaml
檔案
wget --no-check-certificate https://projectcalico.docs.tigera.io/archive/v3.25/manifests/calico.yaml
修改calico.yaml
檔案
在- name: CLUSTER_TYPE
下方新增如下內容
- name: CLUSTER_TYPE
value: "k8s,bgp"
#下方為新增內容
- name: IP_AUTODETECTION_METHOD
value: "interface=master節點主機的網路卡名稱"
設定網路
kubectl apply -f calico.yaml
再次檢視節點資訊
kubectl get nodes
依然還是沒有成功;檢視 pod 狀態,沒有正常啟動
kubectl get pods --all-namespaces -o wide | grep kube-system
使用crictl logs
命令檢視任何一個pod,發現有如下錯誤
crictl logs coredns-7bdc4cb885-28jnf
kubectl logs -n kube-system
命令檢視狀態不是running的pod,發現有如下錯誤
kubectl logs -n kube-system calico-node-bfxtk
kubectl logs -n kube-system coredns-7bdc4cb885-28jnf
新建/etc/crictl.yaml
檔案,寫入如下內容
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false
使用kubectl delete pod -n kube-system
命令刪除那些狀態不是running的pod。例如
kubectl delete pod -n kube-system calico-kube-controllers-6c99c8747f-kmkdl
再次檢視pod的啟動狀態,全部都是在running狀態
kubectl get pod -n kube-system
另外crictl ps
也可以使用了。
crictl ps -a
使用crictl logs
也可以檢視紀錄檔了
crictl logs 4838afe83150e
! grep -q kubectl "$HOME/.bashrc" && echo "source /usr/share/bash-completion/bash_completion" >>"$HOME/.bashrc"
! grep -q kubectl "$HOME/.bashrc" && echo "source <(kubectl completion bash)" >>"$HOME/.bashrc"
! grep -q kubeadm "$HOME/.bashrc" && echo "source <(kubeadm completion bash)" >>"$HOME/.bashrc"
! grep -q crictl "$HOME/.bashrc" && echo "source <(crictl completion bash)" >>"$HOME/.bashrc"
source "$HOME/.bashrc"
# 獲取節點
kubectl get nodes -o wide
# 實時查詢nodes狀態
watch kubectl get nodes -o wide
# 獲取pod
kubectl get pods --all-namespaces -o wide
# 檢視映象列表
kubeadm config images list
# 節點加入叢集
kubeadm token create --print-join-command
# 描述node
kubectl describe node k8s-master
# 描述pod
kubectl describe pod kube-flannel-ds-hs8bq --namespace=kube-system
以下命令在主節點執行
kubectl create deployment nginx --image=nginx
kubectl get pods -o wide
等待ContainerCreating
變成Running
後執行下一個步驟
kubectl expose deployment nginx --port=80 --type=NodePort
kubectl get pod,svc
http://192.168.10.155:31930/
地址根據你自己的主機變化,埠上面輸出的資訊中 PORT(S) 這一欄會有