天天看點

k8s叢集環境搭建完全版

作者:架構師小林

下面進行k8s環境的搭建,當然我是在自己本地電腦的虛拟機搭建的,并且每個節點配置設定了4G的記憶體,我電腦共16G記憶體,三個節點就占據了12G,卡卡的,但是沒辦法,總不能用雲伺服器吧,不過貌似用雲伺服器也是可以的,按量計費,搭建完也費不了多少錢吧,練習完後就删掉即可。

講真下面已經是我第二次搭建了,第一次搭建,雖然控制台進去了,但是在一個節點竟然不能通路另一個節點的pod,pod和service在叢集中不是可以肆意的通路麼?網上查可能是因為Pod CIDR與節點IP沖突,Calico的Pod CIDR即—pod-network-cidr預設使用的是192.168.0.0/16,而當叢集節點的IP段也為192.168.0.0/16時,必然導緻IP段沖突,由于不會在搭建好後重新修改這些配置,是以隻能重新搭建了。

一、環境準備

1、相關版本

Linux: CentOS7 64位
docker:20.10.7
kubelet:1.20.9 
kubeadm:1.20.9 
kubectl:1.20.9           

2、虛拟機準備

我是準備搭建三個節點的叢集,畢竟本地虛拟機,配置比較弱,linux記憶體都是給的4G,已經是我能給的極限了,大家有條件的可以用8G。目前規劃下面幾個IP。

k8s-new-master:192.168.192.8
k8s-new-node1:192.168.192.9
k8s-new-node2:192.168.192.10           

這裡虛拟機的搭建可以參考我如下幾篇筆記

安裝VMware15

CentOS7鏡像官網下載下傳

VMWare安裝CentOS7超全圖解

最小系統Centos7進行網絡配置以及 ifconfig和vim的安裝

VMWare 克隆Linux虛拟機

3、安裝好後先克隆三台機器

密碼都是root/forever、記憶體都是4G、然後參考上面的筆記修改好對應的ip位址。弄好後最好做個快照,防止後面操作失敗可以恢複快照重新來過(我就是master節點忘記設定host本身的k8s-new-master導緻重新來過了)。

二、k8s叢集搭建

1、先安裝好docker

1-1、解除安裝以前的docker包,這個步驟正常新的linux不用執行

sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine           

1-2、配置好yum源

sudo yum install -y yum-utils
sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo           

1-3、安裝docker,我們選擇固定版本

yum install -y docker-ce-20.10.7 docker-ce-cli-20.10.7  containerd.io-1.4.6           

在加入節點的時候會報警告說版本不對,其實可以不用理會,如果有強迫症可以用下面的版本

yum install -y docker-ce-19.03.0 docker-ce-cli-19.03.0  containerd.io-1.4.6           

如果用預設版本就用這個

sudo yum install -y docker-ce docker-ce-cli containerd.io           

1-4、啟動docker

systemctl enable docker --now           

1-5、配置加速

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://970k7x82.mirror.aliyuncs.com"],
  "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           

2、安裝k8s基礎環境設定

所有機器執行如下操作

各個機器設定自己的域名

hostnamectl set-hostname xxxx           

我這裡就設定為

hostnamectl set-hostname k8s-new-master
hostnamectl set-hostname k8s-new-node1
hostnamectl set-hostname k8s-new-node2           

将 SELinux 設定為 permissive 模式(相當于将其禁用)

sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config           

關閉swap

swapoff -a  
sed -ri 's/.*swap.*/#&/' /etc/fstab           

關閉防火牆

systemctl stop firewalld           

允許 iptables 檢查橋接流量

cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF

cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF           

讓上面的配置生效

sudo sysctl --system           

3、安裝kubelet、kubeadm、kubectl

cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
   http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
exclude=kubelet kubeadm kubectl
EOF           
sudo yum install -y kubelet-1.20.9 kubeadm-1.20.9 kubectl-1.20.9 --disableexcludes=kubernetes           
sudo systemctl enable --now kubelet           

4、使用kubeadm引導叢集

4-1、下載下傳各個機器需要的鏡像

sudo tee ./images.sh <<-'EOF'
#!/bin/bash
images=(
kube-apiserver:v1.20.9
kube-proxy:v1.20.9
kube-controller-manager:v1.20.9
kube-scheduler:v1.20.9
coredns:1.7.0
etcd:3.4.13-0
pause:3.2
)
for imageName in ${images[@]} ; do
docker pull registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/$imageName
done
EOF           
chmod +x ./images.sh && ./images.sh           

4-2、初始化主節點

所有機器添加master域名映射,以下需要修改為自己的

echo "192.168.192.8  k8s-new-master" >> /etc/hosts           

下面的操作都在主節點即可

主節點初始化,隻需要在主節點也就是master做即可

正常service-cidr和pod-network-cidr不建議修改,應為後面一些網絡配置用的就是它,如果修改了要做相應的調整

但是我這裡pod-network-cidr因為這個跟本機沖突了,是以導緻ping不通pod,是以我這裡改了一下,後面安裝網絡插件calico.yaml的時候也需要對應的修改下,pod-network-cidr的預設值為192.168.0.0/16,我改為10.244.0.0/16。(參考:https://blog.csdn.net/weixin_43757027/article/details/123577417)

kubeadm init \
--apiserver-advertise-address=192.168.192.8 \
--control-plane-endpoint=k8s-new-master \
--image-repository registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images \
--kubernetes-version v1.20.9 \
--service-cidr=10.96.0.0/16 \
--pod-network-cidr=10.244.0.0/16           

要保證所有網絡範圍不重疊,執行完後會有一段日志,一定要拷貝下來,後面加入節點有用

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/

You can now join any number of control-plane nodes by copying certificate authorities
and service account keys on each node and then running the following as root:

  kubeadm join k8s-new-master:6443 --token wyd5si.xujsxwbpndj7b9n1 \
    --discovery-token-ca-cert-hash sha256:071c85ba8f7b184394bd3e44e54243152bbb658f1053c0a90b590631b6370cb2 \
    --control-plane 

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join k8s-new-master:6443 --token wyd5si.xujsxwbpndj7b9n1 \
    --discovery-token-ca-cert-hash sha256:071c85ba8f7b184394bd3e44e54243152bbb658f1053c0a90b590631b6370cb2           

根據上面的日志提示繼續執行

4-3、設定.kube/config

mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config           

4-4、安裝網絡元件

若沒有wget指令,可以先安裝

yum install -y wget           
wget https://docs.projectcalico.org/manifests/calico.yaml           

然後發現網絡不通,下載下傳報錯,則用這個https://www.suibibk.com//fileupload/files/calico.yaml

這裡一定要修改下面邏輯

# - name: CALICO_IPV4POOL_CIDR
#   value: "192.168.0.0/16"
  - name: CALICO_IPV4POOL_CIDR
    value: "10.244.0.0/16"           

ip一定要改為跟之前初始化指定的一樣。

kubectl apply -f calico.yaml           

4-5、加入node節點,也是用上面的日志,這裡要在位元組點執行

kubeadm join k8s-new-master:6443 --token wyd5si.xujsxwbpndj7b9n1 \
    --discovery-token-ca-cert-hash sha256:071c85ba8f7b184394bd3e44e54243152bbb658f1053c0a90b590631b6370cb2           

如果令牌不記得了,可以執行如下指令産生新令牌

kubeadm token create --print-join-command           

提示如下錯誤

[WARNING SystemVerification]: this Docker version is not on the list of validated versions: 20.10.7. Latest validated version: 19.03           

這裡要降低docker的版本(當然不降低也可以,畢竟隻是警告)

如果卡住,那麼需要關閉防火牆,前面的流程應該已經關閉

systemctl stop firewalld           

當然最好先永久關閉,不然開機後可能有問題

systemctl disable firewalld #永久關閉,即設定開機的時候不自動啟動           

加入後過幾分鐘,在master節點就會看到

[root@k8s-new-master ~]# kubectl get nodes
NAME             STATUS   ROLES                  AGE     VERSION
k8s-new-master   Ready    control-plane,master   31m     v1.20.9
k8s-new-node1    Ready    <none>                 3m22s   v1.20.9
k8s-new-node2    Ready    <none>                 3m4s    v1.20.9           

4-6、如果是加入高可用的主節點,也是按日志的步驟執行下面指令即可

kubeadm join k8s-new-master:6443 --token wyd5si.xujsxwbpndj7b9n1 \
    --discovery-token-ca-cert-hash sha256:071c85ba8f7b184394bd3e44e54243152bbb658f1053c0a90b590631b6370cb2 \
    --control-plane           

4-7、相關指令

#檢視叢集所有節點
kubectl get nodes

#根據配置檔案,給叢集建立資源
kubectl apply -f xxxx.yaml

#檢視叢集部署了哪些應用?
docker ps   ===   kubectl get pods -A
# 運作中的應用在docker裡面叫容器,在k8s裡面叫Pod
kubectl get pods -A           

5、部署dashboard

kubernetes官方提供的可視化界面

https://github.com/kubernetes/dashboard

執行如下指令就可

kubectl apply -f https://www.suibibk.com//fileupload/files/dashboard.yaml           

可以下載下傳下來再執行,裡面的主節點是k8s-master,記得全部要改為自己的,我現在是k8s-new-master

檢視狀态

kubectl get pods -A           

都running了後再繼續執行

如果出錯了,可以重新開機

kubectl replace --force -f dashboard.yaml           

5-1、設定通路端口

kubectl edit svc kubernetes-dashboard -n kubernetes-dashboard           

type: ClusterIP 改為 type: NodePort

5-2、找到端口

kubectl get svc -A |grep kubernetes-dashboard           
443:30110           

雲伺服器需要安全組放行,防火牆放行

通路:

https://叢集任意IP:端口                

我這裡是:https://192.168.192.8:30110

5-3、故障

完全通路不了,檢視日志

#檢視容器
kubectl get pods -A

#檢視日志
kubectl logs kubernetes-dashboard-775688487c-fpzv8 -n kubernetes-dashboard           

發現錯誤

Initializing csrf token from kubernetes-dashboard-csrf secret panic: Get https://10.96.0.1:443/api/v1/namespaces/kubernetes-dashboard/secrets/kubernetes-dashboard-csrf: dial tcp 10.96.0.1:443: i/o timeout           

跟我遇到的一樣的原因

https://blog.csdn.net/qq_44847649/article/details/123504663

https://blog.csdn.net/qq_44847649/article/details/123082308

參考解決下,解決完後,要用這個強制重新部署

kubectl replace --force -f dashboard.yaml           

再檢視狀态就很正常了

kubectl get pods -A           

重走5-1,5-2

通路,大公告成:https://192.168.192.8:30110

如果用我上面的yaml,則隻需修改主節點的名字即可,不需要做其他操作,也不會遇到上面的問題。

5-4、建立通路賬号

#建立通路賬号,準備一個yaml檔案; vi dash.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: admin-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: admin-user
  namespace: kubernetes-dashboard           
kubectl apply -f dash.yaml           

5-5、擷取通路令牌

#擷取通路令牌
kubectl -n kubernetes-dashboard get secret $(kubectl -n kubernetes-dashboard get sa/admin-user -o jsonpath="{.secrets[0].name}") -o go-template="{{.data.token | base64decode}}"           

下面的是我的登入token,每個人都要用自己的

eyJhbGciOiJSUzI1NiIsImtpZCI6IkVRZGZRRm52ZlJwcWRlc040dURELTluQ1daZjV2M3o2dnBzaEhReDBZbTAifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyLXRva2VuLXRqbXJwIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiJmN2M3OGJkZi0xN2YzLTQxY2UtYmVhNS1lYzA0MDY4ZDgxYTQiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZXJuZXRlcy1kYXNoYm9hcmQ6YWRtaW4tdXNlciJ9.tUEW6nt4KvoV48eoAShBFqGUQx4e5KHb8nB8X24JhNf9vGhAfgAKgLo1S4HEgmqPkM1FUsMxxeNZMvRvjOI7Ju9AVUQkG7bz3skd1I_yZSoiOlcc6_woCXZ0az_nOGwvjjYeE8s8TuBT0nGkiKyZBiruyjyluHJyvv_wYex4DsyGUTKytX7ab0ndSz67JdVvzsfKjOrHmvSc_93D_mWvPwuboma-22qtdH5B-OZ3LOtj-15jRdSd3B4fTsZkw8Sijjgda5ltfncYvg-MJbAq0BEOhYYzmLL5p6CfD5Nq9rnDC1NcrMQfkUu3FblekDfWasHqRvM7iEBr_G0dvuh_Pg           

5-6、這裡建議永久關閉下firewall

因為上面就是因為防火牆沒關閉加入節點報錯

systemctl disable firewalld #永久關閉,即設定開機的時候不自動啟動           

5-7、重新開機試試,重新開機完後執行指令

#重新開機
reboot
#檢視節點
kubectl get nodes
#檢視pod
kubectl get pods -A           

通路控制台https://192.168.192.8:30110

發現都正常,至此,k8s叢集搭建成功

喵的,電腦才16G記憶體,搭建這個叢集果然有點費力

5-8、簡單測試

建立一個nginx的yaml:nginx-pod.yaml

apiVersion: v1
kind: Pod
metadata:
  labels:
    run: mynginx
  name: mynginx
#  namespace: default
spec:
  containers:
  - image: nginx
    name: mynginx           
kubectl apply -f nginx-pod.yaml           

檢視pod的ip

kubectl get pods -owide           
NAME      READY   STATUS    RESTARTS   AGE    IP            NODE            NOMINATED NODE   READINESS GATES
mynginx   1/1     Running   0          2m2s   10.244.53.1   k8s-new-node2   <none>           <none>           

可以看到是在節點2,我們在master通路下

curl 10.244.53.1:80           

發現成功啦,第二次安裝由于指定了pod-network-cidr,終于沒有出現問題,開心,得打個快照才行,防止後面搞kubesphere搞壞。

繼續閱讀