centos7 部署kubernetes 1.20.1


===============================================

 2021/2/6_第2次修改                       ccb_warlock

 

更新說明:

2021/2/6:

1.增加了3.6,kubernetes端口范圍修改的內容

2.在2.3中,增加了禁用swap討論的鏈接地址

===============================================

距離上次接觸kubernetes已經是3年前,當時為了給前公司項目的運維集群框架選型而接觸了幾天,當時還整理了部署手冊(https://www.cnblogs.com/straycats/p/8506959.html)。因為當時對linux和docker的了解較少,且公司項目的規模較小,所以最后選擇了docker swarm。雖然docker官方也明確表示已經放棄swarm,正在主推kubernetes,但是我仍然覺得小項目用swarm也十分合適,框架的層次和操作邏輯都比kubernetes要簡單的多。

 

目前在做的項目定了以kubernetes作為docker的運維框架,所以我被負責學習和應用基於kubernetes運維demo項目的內容。經過2周的接觸,其實kubernetes沒我之前感覺的那么難學,從yaml部署的角度來說雖然內容比docker swarm豐富很多,但是很多內容共通。所以有着swarm的知識和經驗,學習kubernetes相對來說還較為順利。本次部署原本想部署1.19.x,但是試驗后發現1.19的kube-apiserver的容器始終異常重啟,為了節省時間我試驗了1.18.x和1.20.1正常后,最后選擇用1.20.1作為使用的kubernetes版本。

 

那么重回kubernetes,還是以部署着手,故先整理部署的內容。我一直認為,做技術一定要踏踏實實,學習並使用別人的東西一定要多動手,會部署是真正會用的第一步。

 

由於時間所限,暫時沒有時間去學習怎么使用多主多從的集群操作,先整理單master(也就是負載也放在同一個服務器的結構)的內容。后續試驗了多主多從的操作后,再更新負載節點(node)的內容。該篇較於之前(https://www.cnblogs.com/straycats/p/8506959.html)整理國內有網絡的情況下如何部署的內容,不在受限教程提供的離線鏡像包,當kubernetes有新版本也可以通過阿里雲提供的鏡像進行升級(雖然現在通過國內的鏡像服務器拉取k8s.io的鏡像也較為簡單)。

 


一、部署docker

可以參考:https://www.cnblogs.com/straycats/p/10680502.html

 


二、配置服務器

2.1 設置各個服務器節點的hostname

# 設置master節點的hostname

hostnamectl --static set-hostname k8s-master01

 

2.2 修改SELinux

# 將 SELinux 設置為 permissive 模式(相當於將其禁用)

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

 

2.3 關閉swap

kubernetes官方要求禁用交換分區,也就是常說的虛擬內存。

國外也對禁用有不同的意見(https://github.com/kubernetes/kubernetes/issues/53533https://medium.com/tailwinds-navigator/kubernetes-tip-why-disable-swap-on-linux-3505f0250263),就像前公司買過阿里雲ECS,結果windows的虛擬內存是默認禁用一樣,本質希望完全使用內存來提高運行效率,但是當資源不夠時反而會適得其反。

雖然有很多爭議,但是為了運行正常還是按官方的要求禁用。

 

# 當前臨時關閉虛擬內存

swapoff -a

 

# 修改/etc/fstab文件

vi /etc/fstab

注釋掉swap的自動掛載,wq保存。

#/dev/mapper/centos-swap swap swap defaults 0 0

 

# 查看內存使用情況

free -m

 

2.4 配置k8s的路由參數(防止kubeadm報路由警告)

centos7上的某些用戶報告了由於iptables被繞過而導致流量被錯誤路由的問題。你應該確保net.bridge.bridge-nf-call-iptables在你的sysctl配置中設置為1。試驗下來即使是firewalld的也要修改配置。

 

# 創建一個新的配置文件

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

 

# 加載配置

sysctl --system

 


三、部署Master節點

3.1 安裝kubeadm、kubectl、kubelet

kubernetes官方文檔提供的是國外的鏡像源,如下:

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF

 

# 因為不可描述的原因國內無法使用,可以選擇阿里雲的yum源來解決這個問題

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
EOF

 

接着根據官方的說明(https://v1-19.docs.kubernetes.io/zh/docs/setup/release/version-skew-policy/),選擇合適版本的組件進行安裝。

 

# 可以用下面的命令查看可以安裝的版本

yum list kubeadm --showduplicates | sort -r

 

# 安裝

yum install -y kubelet-1.20.1-0 kubeadm-1.20.1-0 kubectl-1.20.1-0 --disableexcludes=kubernetes

 

# 啟動開機啟動kubelet

systemctl start kubelet
systemctl enable kubelet

 

3.2 初始化集群

通過  kubeadm config images list 可以查看部署服務所需要用的鏡像以及版本信息。

 

# 創建集群

kubeadm init \
  --kubernetes-version=v1.20.1 \
  --pod-network-cidr=10.244.0.0/16 \
  --image-repository registry.aliyuncs.com/google_containers \
  --apiserver-advertise-address 192.168.3.89 \
  --v=6

參數說明:

kubernetes-version:要安裝的版本

pod-network-cidr:負載容器的子網網段

image-repository:指定鏡像倉庫(由於從阿里雲拉鏡像,解決了k8s.gcr.io鏡像拉不下來的問題)

apiserver-advertise-address:節點綁定的服務器ip(多網卡可以用這個參數指定ip)

v=6:這個參數我還沒具體查文檔,用法是初始化過程顯示詳細內容,部署過程如果有問題看詳細信息很多時候能找到問題所在

 

 

# 接着根據提示拷貝admin.config的內容到當前用戶的$HOME/.kube/config中並授權(為了使當前用戶使用kubelet操作服務器)

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

 

上圖中的token信息要記得保留,新節點加入該集群需要使用。如果忘記了,可以在master節點上通過 kubeadm token list 得到token,默認24小時后過期。

 

token過期后,新節點要加入該集群,需要在master節點上用下面的命令重新生成token。

kubeadm token create

 

PS. 如果本地沒有導入k8s.gcr.io的鏡像或沒有配置國內的鏡像庫,會導致卡在“[init] This might take a minute or longer if the control plane images have to be pulled.”,這時候就要先退出重置后,再初始化。

# 用下面的命令重置集群

kubeadm reset

 

# 刪除/root/.kube目錄

rm -rf $HOME/.kube

 

3.3 查看版本

kubectl version

 

3.4 安裝flannel

剛部署完節點狀態還不是Ready,需要安裝通信組件,常用有flannel和calico,這里選擇flannel。

 

# 創建目錄

mkdir -p /opt/yaml

 

# 編輯kube-flannel.yaml

vi /opt/yaml/kube-flannel.yaml

獲取部署flannel的yaml文件(https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml)到/opt/yaml目錄中,由於不可描述的原因國內訪問不了,我這里貼下2021.1獲取的內容。

---
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
  name: psp.flannel.unprivileged
  annotations:
    seccomp.security.alpha.kubernetes.io/allowedProfileNames: docker/default
    seccomp.security.alpha.kubernetes.io/defaultProfileName: docker/default
    apparmor.security.beta.kubernetes.io/allowedProfileNames: runtime/default
    apparmor.security.beta.kubernetes.io/defaultProfileName: runtime/default
spec:
  privileged: false
  volumes:
  - configMap
  - secret
  - emptyDir
  - hostPath
  allowedHostPaths:
  - pathPrefix: "/etc/cni/net.d"
  - pathPrefix: "/etc/kube-flannel"
  - pathPrefix: "/run/flannel"
  readOnlyRootFilesystem: false
  # Users and groups
  runAsUser:
    rule: RunAsAny
  supplementalGroups:
    rule: RunAsAny
  fsGroup:
    rule: RunAsAny
  # Privilege Escalation
  allowPrivilegeEscalation: false
  defaultAllowPrivilegeEscalation: false
  # Capabilities
  allowedCapabilities: ['NET_ADMIN', 'NET_RAW']
  defaultAddCapabilities: []
  requiredDropCapabilities: []
  # Host namespaces
  hostPID: false
  hostIPC: false
  hostNetwork: true
  hostPorts:
  - min: 0
    max: 65535
  # SELinux
  seLinux:
    # SELinux is unused in CaaSP
    rule: 'RunAsAny'
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: flannel
rules:
- apiGroups: ['extensions']
  resources: ['podsecuritypolicies']
  verbs: ['use']
  resourceNames: ['psp.flannel.unprivileged']
- apiGroups:
  - ""
  resources:
  - pods
  verbs:
  - get
- apiGroups:
  - ""
  resources:
  - nodes
  verbs:
  - list
  - watch
- apiGroups:
  - ""
  resources:
  - nodes/status
  verbs:
  - patch
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: flannel
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: flannel
subjects:
- kind: ServiceAccount
  name: flannel
  namespace: kube-system
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: flannel
  namespace: kube-system
---
kind: ConfigMap
apiVersion: v1
metadata:
  name: kube-flannel-cfg
  namespace: kube-system
  labels:
    tier: node
    app: flannel
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"
      }
    }
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: kube-flannel-ds
  namespace: kube-system
  labels:
    tier: node
    app: flannel
spec:
  selector:
    matchLabels:
      app: flannel
  template:
    metadata:
      labels:
        tier: node
        app: flannel
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: kubernetes.io/os
                operator: In
                values:
                - linux
      hostNetwork: true
      priorityClassName: system-node-critical
      tolerations:
      - operator: Exists
        effect: NoSchedule
      serviceAccountName: flannel
      initContainers:
      - name: install-cni
        image: quay.io/coreos/flannel:v0.13.1-rc1
        command:
        - cp
        args:
        - -f
        - /etc/kube-flannel/cni-conf.json
        - /etc/cni/net.d/10-flannel.conflist
        volumeMounts:
        - name: cni
          mountPath: /etc/cni/net.d
        - name: flannel-cfg
          mountPath: /etc/kube-flannel/
      containers:
      - name: kube-flannel
        image: quay.io/coreos/flannel:v0.13.1-rc1
        command:
        - /opt/bin/flanneld
        args:
        - --ip-masq
        - --kube-subnet-mgr
        resources:
          requests:
            cpu: "100m"
            memory: "50Mi"
          limits:
            cpu: "100m"
            memory: "50Mi"
        securityContext:
          privileged: false
          capabilities:
            add: ["NET_ADMIN", "NET_RAW"]
        env:
        - name: POD_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        - name: POD_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        volumeMounts:
        - name: run
          mountPath: /run/flannel
        - name: flannel-cfg
          mountPath: /etc/kube-flannel/
      volumes:
      - name: run
        hostPath:
          path: /run/flannel
      - name: cni
        hostPath:
          path: /etc/cni/net.d
      - name: flannel-cfg
        configMap:
          name: kube-flannel-cfg

 

# 將quay.io換成quay.mirrors.ustc.edu.cn(中科大)的鏡像

sed -i 's#quay.io/coreos/flannel#quay.mirrors.ustc.edu.cn/coreos/flannel#' /opt/yaml/kube-flannel.yaml

 

# 部署flannel

kubectl apply -f /opt/yaml/kube-flannel.yaml

 

再查看節點可以看到已經是ready了。

 

3.5 單節點集群

如果是部署單節點集群(需要master節點也當作node節點負載應用),可以執行下面的命令將所有節點都去除污點標簽(node-role.kubernetes.io/master-)

kubectl taint nodes --all node-role.kubernetes.io/master-

 

如果需要恢復該節點(k8s-master01)為master only,可以添加污點標簽

kubectl taint node k8s-master01 node-role.kubernetes.io/master=""

 

3.6 修改kube-apiserver的端口范圍

kubernetes默認的端口范圍:30000 - 32768,如果使用默認配置,則無法與這個范圍以外的宿主機端口做映射,可以通過以下操作來修改端口范圍。

 

# 編輯kube-apiserver配置文件

vi /etc/kubernetes/manifests/kube-apiserver.yaml

 

如下,在command.kube-apiserver中增加service-node-port-range項,wq保存。

- command:
    - kube-apiserver
    - --service-node-port-range=1-65535 

 

接着刪除kube-apiserver的pod即可(kubernetes會創建新pod),因為我這宿主機的hostname設置為了k8s-master01,故我使用下面的命令刪除:

kubectl delete pod kube-apiserver-k8s-master01 -n kube-system

 


四、部署Node節點

以后補上。

 

 

 


參考資料:

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

2.https://www.jianshu.com/p/25c01cae990c

3.https://blog.csdn.net/zhaoydzhaoyd/article/details/111141273

4.https://blog.csdn.net/qq_41475058/article/details/88849291

5.https://www.jianshu.com/p/63f7f5c021e4

6.http://cache.baiducontent.com/c?m=KeduTYlzKX0XQ2-_aMR5i3qBhCnaxW1U9Xxi3TnYu-kgfpuAtK8HgEyhm5uvYQ3Kx6kJGXJAAeiwd6u5nXW1wwxeRW-HOorPoGwoJ3XI23m4ULhCrHNzCzCmcAfyT567f18ChYtDGZO8psJeb-ouixphBvgkmssnVHQTHrGLVC9dkQ6RNC-aCb_cx-x8GXb5OJ4IMfpUGBUMxJuomhDWD_&p=91759a45d68b00e42abe9b7c5353&newp=817ec54ad6c352eb02a9c7710f5492695c02dc3051d3da01298ffe0cc4241a1a1a3aecbb24241502d9c478610abb0f31aba7747d605f76a4df92cc&s=28dd2c7955ce9264&user=baidu&fm=sc&query=kubelet+%CE%AA%CA%B2%C3%B4%BD%FB%D3%C3%BD%BB%BB%BB%B7%D6%C7%F8&qid=d11469a5000d21d3&p1=20

 

 

 


免責聲明!

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



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