CentOS 安裝 Kubernetes(K8s)


通過 kubeadm 安裝,kubernetes CHANGELOG:https://github.com/kubernetes/kubernetes/releases

 

一、安裝 docker(所有節點)

這里使用 Docker 作為運行時環境,安裝參考:https://www.cnblogs.com/jhxxb/p/11410816.html

安裝完成后需要進行一些配置:https://kubernetes.io/zh/docs/setup/production-environment/container-runtimes/#docker

 

二、安裝 kubeadm(所有節點)

https://developer.aliyun.com/mirror/kubernetes

https://kubernetes.io/zh/docs/setup/production-environment/tools/kubeadm/install-kubeadm

准備

# 關閉防火牆
sudo systemctl stop firewalld.service
sudo systemctl disable firewalld.service

# 阿里 YUM 源
sudo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
sudo curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
sudo sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo
yum makecache

# 將 SELinux 設置為 permissive 模式(相當於將其禁用)
sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

# 關閉 swap,swap 為 0
sudo sed -ri 's/.*swap.*/#&/' /etc/fstab
sudo swapoff -a
free -g

# 允許 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

安裝

# 添加阿里雲 YUM 源,安裝 kubeadm,kubelet 和 kubectl
sudo bash -c 'cat << EOF > /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=kubelet kubeadm kubectl
EOF'

# 安裝
yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes

# 開機啟動,sudo systemctl enable kubelet && sudo systemctl start kubelet
sudo systemctl enable --now kubelet

# 查看 kubelet 狀態
systemctl status kubelet
kubelet --version

# 重新啟動 kubelet
sudo systemctl daemon-reload
sudo systemctl restart kubelet

 

三、使用 kubeadm 安裝 Kubernetes(Master 安裝,其它節點加入)

https://kubernetes.io/zh/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm

Master 節點初始化安裝 kubernetes

https://kubernetes.io/zh/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/#初始化控制平面節點

init 參數:https://kubernetes.io/zh/docs/reference/setup-tools/kubeadm/kubeadm-init

這里 https://github.com/zhangguanzhang/google_containers 提供了 google_containers 國內的鏡像地址:registry.aliyuncs.com/k8sxio

確保主機名不是 localhost 並且可以 ping 通(/etc/hosts)

# --apiserver-advertise-address 的值換成 Master 主機 IP
# 不指定 --kubernetes-version 默認會從 https://dl.k8s.io/release/stable-1.txt 獲取最新版本號
sudo kubeadm init \
--apiserver-advertise-address=10.70.19.33 \
--image-repository registry.aliyuncs.com/google_containers \
--service-cidr=10.96.0.0/16 \
--pod-network-cidr=192.168.0.0/16

初始化過程中若下載失敗,可暫時下載 latest,然后打 tag,例如 coredns:v1.8.4

# 查看所需鏡像
kubeadm config images list
docker pull registry.aliyuncs.com/google_containers/coredns
docker tag registry.aliyuncs.com/google_containers/coredns:latest registry.aliyuncs.com/google_containers/coredns:v1.8.4

初始化好后按照提示執行:https://kubernetes.io/zh/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/#更多信息

Master 節點安裝 Pod 網絡

https://kubernetes.io/zh/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/#pod-network

集群只能安裝一個 Pod 網絡,通過 kubectl get pods --all-namespaces 檢查 CoreDNS Pod 是否 Running 來確認其是否正常運行。一旦 CoreDNS Pod 啟用並運行,就讓 Node 可以加入 Master 了

# 主節點安裝網絡
# kubectl apply -f https://raw.githubusercontent.com/coreos/flanne/master/Documentation/kube-flannel.yml
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
kubectl get ns
# 查看所有名稱空間的 pods
# kubectl get pods --all-namespaces
kubectl get pod -o wide -A
# 查看指定名稱空間的 pods
kubectl get pods -n kube-system

允許 Master 點部署 Pod(可選)

https://kubernetes.io/zh/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/#控制平面節點隔離

# 允許 Master 節點部署 Pod
kubectl taint nodes --all node-role.kubernetes.io/master-
# 如果不允許調度
kubectl taint nodes master1 node-role.kubernetes.io/master=:NoSchedule
# 污點可選參數:
#  NoSchedule: 一定不能被調度
#  PreferNoSchedule: 盡量不要調度
#  NoExecute: 不僅不會調度, 還會驅逐 Node 上已有的 Pod

其它節點加入主節點

https://kubernetes.io/zh/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/#join-nodes

# 其它節點加入,token 會失效
kubeadm join 10.70.19.33:6443 --token tqaitp.3imn92ur339n4olo --discovery-token-ca-cert-hash sha256:fb3da80b6f1dd5ce6f78cb304bc1d42f775fdbbdc80773ff7c59

# 如果超過 2 小時忘記了令牌
# 打印新令牌
kubeadm token create --print-join-command
# 創建一個永不過期的令牌
kubeadm token create --ttl 0 --print-join-command

# 主節點監控 pod 進度,等待 3-10 分鍾,完全都是 running 以后繼續
watch kubectl get pod -n kube-system -o wide
# 等到所有的 status 都變為 running
kubectl get nodes

到這里 K8s 集群就安裝完成了,下面的不是必須步驟。

 

 

四、Kubernetes Dashboard

https://github.com/kubernetes/dashboard/tree/master/docs

安裝

kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.3.1/aio/deploy/recommended.yaml

# 修改 type: ClusterIP 為 type: NodePort
kubectl -n kubernetes-dashboard edit service kubernetes-dashboard
# 查看 IP 和 Port,獲取訪問地址,這里為 https://<master-ip>:31707
kubectl -n kubernetes-dashboard get service kubernetes-dashboard
# NAME                   TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
# kubernetes-dashboard   NodePort   10.100.124.90   <nodes>       443:31707/TCP   21h

# 獲取默認賬戶 Token
kubectl -n kubernetes-dashboard get secret $(kubectl -n kubernetes-dashboard get sa/kubernetes-dashboard -o jsonpath="{.secrets[0].name}") -o go-template="{{.data.token | base64decode}}"
kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep kubernetes-dashboard-token | awk '{print $1}')

安裝監控:metrics-server

https://kubernetes.io/zh/docs/tasks/debug-application-cluster/resource-usage-monitoring

https://github.com/kubernetes-sigs/metrics-server

Kubernetes Dashboard 默認監控信息為空,安裝 metrics-server,用來監控 pod、node 資源情況(默認只有 cpu、memory 的信息),並在 Kubernetes Dashboard 上顯示,更多信息需要對接 Prometheus

# 測試環境,修改 yaml 文件,添加 --kubelet-insecure-tls 不驗證客戶端證書
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml

# 鏡像下載可能會失敗,可使用其它代替
#docker pull bitnami/metrics-server:0.5.0
docker pull willdockerhub/metrics-server:v0.5.0
docker tag willdockerhub/metrics-server:v0.5.0 k8s.gcr.io/metrics-server/metrics-server:v0.5.0

# 安裝好后查看
kubectl top nodes
kubectl top pods

除了 Kubernetes Dashboard,還有其它 UI

kubesphere:https://kubesphere.io/zh/docs/quick-start/minimal-kubesphere-on-k8s,若安裝過程中有 pod 一直無法啟動,可看看是否為 etcd 監控證書找不到

# 證書在下面路徑
# --etcd-cafile=/etc/kubernetes/pki/etcd/ca.crt
# --etcd-certfile=/etc/kubernetes/pki/apiserver-etcd-client.crt 
# --etcd-keyfile=/etc/kubernetes/pki/apiserver-etcd-client.key
# 創建證書:
kubectl -n kubesphere-monitoring-system create secret generic kube-etcd-client-certs  --from-file=etcd-client-ca.crt=/etc/kubernetes/pki/etcd/ca.crt  --from-file=etcd-client.crt=/etc/kubernetes/pki/apiserver-etcd-client.crt  --from-file=etcd-client.key=/etc/kubernetes/pki/apiserver-etcd-client.key

# 創建后可以看到 kube-etcd-client-certs
ps -ef | grep kube-apiserver
View Code

kuboard:https://kuboard.cn

 

五、持久化(PV、PVC),這里使用 NFS

https://kubernetes.io/zh/docs/concepts/storage/persistent-volumes

https://cloud.tencent.com/document/product/457/47014

安裝 NFS 服務端

https://linux-nfs.org

sudo yum install -y nfs-utils
# 執行命令 vi /etc/exports,創建 exports 文件,文件內容如下(使用no_root_squash 不安全):
sudo bash -c 'echo "/nfs/ *(rw,sync,no_wdelay,no_root_squash)" > /etc/exports'

# 創建共享目錄,設置所屬用戶與組
sudo mkdir -p /nfs/data
sudo chown -R nfsnobody:nfsnobody /nfs/

# 啟動 nfs 服務
sudo systemctl enable --now rpcbind
sudo systemctl enable --now nfs-server

# -a 全部掛載或者全部卸載,-r 重新掛載,-u 卸載某一個目錄,-v 顯示共享目錄
sudo exportfs -arv
# 檢查配置是否生效,會輸出 /nfs <world>
sudo exportfs

安裝 NFS 客戶端。可不裝,K8S 直連 NFS 服務端

# 注意服務端 NFS 端口放行,否則客戶端無法連接,安裝客戶端
sudo yum install -y nfs-utils

# 檢查 NFS 服務器端是否有設置共享目錄
showmount -e NFS服務端IP
# 輸出結果如下所示
# Export list for 172.26.165.243:
# /nfs *

# 執行以下命令掛載 nfs 服務器上的共享目錄到本機路徑 ~/nfsmount
sudo mkdir ~/nfsmount
sudo mount -t nfs NFS服務端IP:/nfs/data ~/nfsmount
# 卸載
sudo umount ~/nfsmount/

# 寫入一個測試文件
echo "hello nfs server" > ~/nfsmount/test.txt
# 在 NFS 服務器上查看,驗證文件寫入成功
cat /nfs/data/test.txt
View Code

創建 PV

https://github.com/kubernetes/examples/blob/master/staging/volumes/nfs/nfs-pv.yaml

PV 沒有 namespace 租戶的概念,PVC 有,當需要在某個 namespace 下使用 PVC 時,需要指定該 PVC 所屬 namespace。

vim nfs-pv.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs
spec:
  capacity:
    storage: 100Mi
  accessModes:
    - ReadWriteMany
  nfs:
    server: 10.74.2.71
    path: "/nfs/data"

kubectl create -f nfs-pv.yaml

創建 PVC

https://github.com/kubernetes/examples/blob/master/staging/volumes/nfs/nfs-pvc.yaml

vim nfs-pvc.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nfs
  namespace: default
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: ""
  resources:
    requests:
      storage: 10Mi

kubectl create -f nfs-pvc.yaml

 

六、安裝 sc(StorageClass),使用 NFS

https://kubernetes.io/zh/docs/concepts/storage/storage-classes

默認不支持 NFS,需要插件:https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner

運維人員創建 PV,開發操作 PVC。在大規模集群中可能會有很多 PV,如果這些 PV 都需要運維手動來處理,也是一件很繁瑣的事情,所以就有了動態供給(Dynamic Provisioning)概念

上面創建的 PV 都是靜態供給方式(Static Provisioning),而動態供給的關鍵就是 StorageClass,它的作用就是創建 PV 模板

創建的 StorageClass 里面需要定義 PV 屬性,如存儲類型、大小等,另外創建這種 PV 需要用到存儲插件。最終效果是用戶創建 PVC,里面指定存儲類型(StorageClass),如果符合我們定義的 StorageClass,則會為其自動創建 PV 並進行綁定

# 先創建授權,創建 PV 需要相關權限,命名空間默認為 default,若為其它名字,需要下載后修改再創建
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/nfs-subdir-external-provisioner/master/deploy/rbac.yaml

# 配置 NFS
curl -O https://raw.githubusercontent.com/kubernetes-sigs/nfs-subdir-external-provisioner/master/deploy/deployment.yaml
vim deployment.yaml

# 只列出修改部分,已注釋
containers:
  - name: nfs-client-provisioner
    image: willdockerhub/nfs-subdir-external-provisioner:v4.0.2 # 換成第三方鏡像地址,本身可以下載就不用換
    volumeMounts:
      - name: nfs-client-root
        mountPath: /persistentvolumes
    env:
      - name: PROVISIONER_NAME
        value: k8s-sigs.io/nfs-subdir-external-provisioner # 供應者名字,可隨意命名,但后面引用要一致
      - name: NFS_SERVER
        value: 10.74.2.71 # NFS 地址
      - name: NFS_PATH
        value: /nfs/data # NFS 路徑
volumes:
  - name: nfs-client-root
    nfs:
      server: 10.74.2.71 # NFS 地址
      path: /nfs/data # NFS 路徑

# 再創建
kubectl apply -f deployment.yaml

# 最后創建 storage class,其中 provisioner 值為上面定義的供應者名字
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/nfs-subdir-external-provisioner/master/deploy/class.yaml
# 查看
kubectl get sc
# 設置為默認,再查看 name 上會顯示 default
kubectl patch storageclass managed-nfs-storage -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'

 

七、部署應用

https://www.cnblogs.com/jhxxb/p/15298810.html

 

八、卸載

kubeadm reset
rm -rf /etc/cni/net.d/
rm -rf ~/.kube/config
docker container stop $(docker container ls -a -q)
docker system prune --all --force --volumes

 


https://www.yuque.com/leifengyang/kubesphere

https://www.cnblogs.com/sparkdev/p/9177283.html

https://www.cnblogs.com/rexcheny/p/10925464.html


免責聲明!

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



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