Kubernetes環境搭建

前言

本篇是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=//mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
    enabled=1
    gpgcheck=0
    repo_gpgcheck=0
    gpgkey=//mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
           //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":[
        "//kfwkfulq.mirror.aliyuncs.com",
        "//2lqq34jg.mirror.aliyuncs.com",
        "//pee6w651.mirror.aliyuncs.com",
        "//hub-mirror.c.163.com",
        "//docker.mirrors.ustc.edu.cn",
        "//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 //kuboard.cn/install-script/v1.21.x/calico-operator.yaml
wget //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

結束

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

Tags: