Kubernetes環境搭建

大魔王先生發表於2021-09-02

前言

本篇是Kubernetes第二篇,大家一定要把環境搭建起來,看是解決不了問題的,必須實戰。

Kubernetes系列文章:
  1. Kubernetes介紹

Kubernetes搭建方式介紹和對比

Minikube

Minikube是一種可以在本地輕鬆執行Kubernetes的工具。Minikube在膝上型電腦的VM中執行單節點Kubernetes叢集,供希望嘗試Kubernetes或日常開發的使用者測試使用。特點是不能啟動生產叢集,沒有高可用性的單節點機器。

Kubeadm

Kubeadm是Kubernetes 1.4開始新增的特性,Kubeadm 是一個提供了 kubeadm init 和 kubeadm join 的工具, 作為建立 Kubernetes 叢集的 “快捷途徑” 的最佳實踐。Kubeadm 通過執行必要的操作來啟動和執行最小可用叢集。 按照設計,它只關注啟動引導,而非配置機器。同樣的, 安裝各種 “錦上添花” 的擴充套件,例如 Kubernetes Dashboard、 監控方案、以及特定雲平臺的擴充套件,都不在討論範圍內。Kubeadm是一種把 kubelet 直接執行在宿主機上,然後使用容器部署其他的 Kubernetes 元件的方案。

Kind

Kind 是 Kubernetes in Docker 的簡寫,是一個使用 Docker 容器作為 Nodes,在本地建立和執行 Kubernetes 群集的工具。適用於在本機建立 Kubernetes 群集環境進行開發和測試。Kind 使用kubeadm建立和啟動群集節點,使用 containerd 作為容器執行時。

二進位制包

二進位制包就是在官網下載相關的元件的二進位制包,相對於上面兩種快速搭建叢集的方式,其實就是相當於用程式指令碼幫我們裝好了叢集,前兩者屬於自動部署,簡化部署操作,自動部署遮蔽了很多細節,使得對各個模組感知很少,遇到問題很難排查,如果手動安裝,對Kubernetes理解也會更全面。二進位制包目前生產環境的主流搭建方式,已在生產環境驗證,kubeadm也可以搭建生產環境。

使用Kubeadm搭建Kubernetes學習環境

這裡我簡單說下我為啥選擇Kubeadm作為自己搭建叢集工具,Kind、Minikube實在是太簡單,根本讓我們感覺不到一點困難,Kubeadm可以讓我們適當體驗Kubernetes搭建過程,去理解一些元件之間的互動,二進位制才是我們終極目標,我只是剛開始不想讓大家被安裝就抹滅了學習Kubernetes的興趣。

配置說明

在搭建K8S叢集時,推薦在阿里雲或騰訊雲採購如下配置(當然也可以使用自己虛機):

  1. 至少2臺2C2G的伺服器,最好2C4G或者8G,2G的話記憶體單存Kubernetes就會佔用一般,後面不太方便大家做實驗,我採用的2臺2C4G阿里雲機器;
  2. 系統的話大家採用CentOS 7.X 或 CentOS 8.X的版本,這裡我採用8.2的版本;
搭建前準備工作

注意:我這裡採用的Kubernetes1.21.2和Docker 20.10.7的版本,大家注意下版本問題。

檢視Linux版本
#所有機器都進行檢查
cat /etc/redhat-release
修改hostname
#這裡強烈建議修改hostname,這樣子在叢集列表查詢的時候很很明確
#修改hostname
hostnamectl set-hostname demo-master-1
#檢查是否修改成功
hostname
#設定hostname解析 類似windows的host解析
echo "127.0.0.1   $(hostname)" >> /etc/hosts
檢視網路
#檢視內網ip地址 找到eth0
ip add
#使用ping命令保證每個節點都是IP地址必須可以互通
ping
#關閉防火牆
systemctl stop firewalld
systemctl disable firewalld
image.png
image.png
Docker安裝

可以參考我的這篇博文;

安裝 kubeadm、kubelet 和 kubectl
  1. 配置配置Kubernetes的yum源;

    cat <<EOF > /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
    EOF
  2. 如果存在舊版本首先解除安裝舊版本,安裝kubelet、kubeadm、kubectl,如果非Master可以不安裝kubectl;

    #解除安裝Kubernetes
    yum remove -y kubelet kubeadm kubectl
    #安裝
    yum install -y kubelet-1.21.2 kubeadm-1.21.2 kubectl-1.21.2
    #非master可以採用以下命令
    yum install -y kubelet-1.21.2 kubeadm-1.21.2
  3. 關閉Swap,這裡簡單聊下Kubernetes為什麼會關閉Swap?Swap Space是磁碟上的一塊區域,可以是一個分割槽,也可以是一個檔案,或者是他們的組合。簡單點說,當系統實體記憶體吃緊時,Linux會將記憶體中不常訪問的資料儲存到Swap上,這樣系統就有更多的實體記憶體為各個程式服務,而當系統需要訪問Swap上儲存的內容時,再將Swap上的資料載入到記憶體中。Kubernetes關閉Swap一個是效能問題,開啟Swap會嚴重影響效能(包括記憶體和I/O);另一個是管理問題,開啟Swap後通過Cgroups設定的記憶體上限就會失效,如果不關閉Kubernetes執行會出現錯誤, 即使安裝成功了,node重啟後也會出現kubernetes server執行錯誤;

    swapoff -a
    yes | cp /etc/fstab /etc/fstab_bak
    cat /etc/fstab_bak |grep -v swap > /etc/fstab
  4. 關閉SeLinux,也簡單聊一下為什麼關閉SeLinux?SELinux(Secure Enhanced Linux)安全增強的Linux是美國國家安全域性NSA針對計算機基礎結構安全開發的一個全新的Linux安全策略機制。SELinux可以允許系統管理員更加靈活的來定義安全策略。SELinux是一個核心級別的安全機制,從Linux2.6核心之後就將SELinux整合在了核心當中,因為SELinux是核心級別的,所以我們對於其配置檔案的修改都是需要重新啟動作業系統才能生效的。現在主流發現的Linux版本里面都整合了SELinux機制,CentOS/RHEL都會預設開啟SELinux機制。這裡為什麼建議大家關閉SeLinux,我相信不是專門的運維可能懂這個的人也不多,所以為了防止大家遇到一些奇怪的問題,就把它關閉吧;

    setenforce 0
    sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
  5. 將Docker的Cgroup Driver 修改為systemd並且更改Docker為國內的映象加速器,不然在為Kubernetes叢集新增節點時會報錯;

#修改docker/daemon.json
cat > /etc/docker/daemon.json <<EOF
{
    "exec-opts": ["native.cgroupdriver=systemd"],
    "log-driver""json-file",
    "log-opts": {
    "max-size""100m"
    },
    "storage-driver""overlay2",
    "registry-mirrors":[
        "https://kfwkfulq.mirror.aliyuncs.com",
        "https://2lqq34jg.mirror.aliyuncs.com",
        "https://pee6w651.mirror.aliyuncs.com",
        "http://hub-mirror.c.163.com",
        "https://docker.mirrors.ustc.edu.cn",
        "https://registry.docker-cn.com"
    ]
}
EOF
mkdir -p /etc/systemd/system/docker.service.d
  1. 設定網路配置相關的引數;

    #增加配置
    cat <<EOF > /etc/sysctl.d/
    k8s.confnet.ipv4.ip_forward=1
    net.bridge.bridge-nf-call-ip6tables = 1
    net.bridge.bridge-nf-call-iptables = 1
    EOF
    #載入
    sysctl --system
  2. 重啟docker,並設定開機啟動kubelet;

    # 重啟docker,並啟動 kubelet
    systemctl daemon-reloadsy
    stemctl restart docker
    systemctl enable kubelet && systemctl start kubelet
初始化Master
  1. 配置Host相關內容;

    #只在master節點執行
    export MASTER_IP=172.21.122.230
    #替換為自己hostName
    export APISERVER_NAME=demo-master-1
    #設定Kubernetes容器組所在的網段
    export POD_SUBNET=10.100.0.0/16echo "${MASTER_IP}    ${APISERVER_NAME}" >> /etc/hosts
  2. 配置kubeadm-config.xml相關引數,可以參考該文章,具體學習下引數含義;

    #刪除預設是版本
    rm -f ./kubeadm-config.yaml
    #編輯kubeadm-config
    cat <<EOF > ./kubeadm-config.yaml
    #api的版本
    apiVersion: kubeadm.k8s.io/v1beta2
    #配置的種類
    kind: ClusterConfiguration
    #版本
    kubernetesVersion: v1.21.2
    #映象拉取地址
    imageRepository: registry.aliyuncs.com/google_containers
    #api預設繫結的埠
    controlPlaneEndpoint: "${APISERVER_NAME}:6443"
    #自定義的網路
    networking:  
     serviceSubnet: "10.96.0.0/16"  
     podSubnet: "${POD_SUBNET}"  
     dnsDomain: "cluster.local"
    EOF
  3. 初始化初始化Master節點,成功以後大致資訊如下圖;

    kubeadm init --config=kubeadm-config.yaml --upload-certs
    image.png
    image.png

    如果出現以下錯誤,說明安裝過kubeadm,使用以下命令進行初始化:

    kubeadm reset -f
    
    image.png
    image.png
  4. 配置kubectl;

    rm -rf /root/.kube/
    mkdir /root/.kube/
    cp -i /etc/kubernetes/admin.conf /root/.kube/config
  5. 檢查節點初始化的情況;

    #檢視各個元件執行的情況
    watch kubectl get pod -n kube-system -o wide
    #檢視Master節點情況
    kubectl get nodes -o wide
    image.png
    image.png
    image.png
    image.png
安裝網路外掛

這裡我選擇了Flannel作為我的網路外掛;

export POD_SUBNET=10.100.0.0/16
kubectl apply -f https://kuboard.cn/install-script/v1.21.x/calico-operator.yaml
wget https://kuboard.cn/install-script/flannel/flannel-v0.14.0.yaml
sed -i "s#10.244.0.0/16#${POD_SUBNET}#" flannel-v0.14.0.yaml
kubectl apply -f ./flannel-v0.14.0.yaml
初始化Work節點
  1. 在Master節點上獲取join引數;

    kubeadm token create --print-join-command
  2. 配置Work節點的host資訊;

    # 只在master節點執行
    export MASTER_IP=172.21.122.230
    # 替換為自己hostName
    export APISERVER_NAME=demo-master-1
    echo "${MASTER_IP}    ${APISERVER_NAME}" >> /etc/hosts
  3. 初始化Work節點,執行Master節點上獲取到的Join引數;

    image.png
    image.png
  4. 在Master上檢查初始化結果;

    kubectl get nodes -o wide
    image.png
    image.png

恭喜你,至此安裝完成!

實戰

這個案例就簡單建立一個執行著Nginx的Pod,體驗一把Kubernetes的使用,此外建議大家再開始學習階段不要去使用一些圖形化工具,先把一些命令整體去了解一下,以後在使用圖形化介面。

  1. 建立一個nginx-deployment.yaml檔案,這裡大家可以使用vscode去編輯,然後同步到伺服器上,應該vscode也可以直接同步到伺服器上,具體怎麼配置大家自行百度,編寫如下內容:
#api版本
apiVersion: apps/v1
#指定資源的角色
kind: Deployment
#後設資料名稱
metadata:
  name: nginx-deployment
#指定該資源的內容詳情
spec:
  #選擇器
  selector:
    matchLabels:
      app: nginx
  #Pod的定義
  template:
    metadata:
      labels:
        app: nginx
    #指定該資源的內容
    spec:
      containers:
      #容器名稱
      - name: nginx
        #映象版本
        image: nginx:latest
        #資源的限制
        resources:
          limits:
            memory: "128Mi"
            cpu: "500m"
        #暴露的埠
        ports:
        - containerPort: 80

  1. 在Master上執行該資源;

    kubectl create -f nginx-deployment.yaml
  2. 檢查資源是否建立成功,這裡我通過標籤選擇器進行檢視,所以跟-l的引數;

    kubectl get pods -l app=nginx
    image.png
    image.png
  3. 檢視Pod的整個詳情;

    #後面跟著具體的pod名稱
    kubectl describe pod nginx-deployment-7dc45fbd74-5bh2z
    image.png
    image.png

結束

歡迎大家點點關注,點點贊!