Kubernetes部署操作及詳細命令


轉載自https://blog.csdn.net/weixin_43551152/article/details/87970671

 

Kubernetes技術已經成為了原生雲技術的事實標准,它是目前基礎軟件領域最為熱門的分布式調度和管理平台。於是,Kubernetes也幾乎成了時下開發工程師和運維工程師必備的技能之一。

一、主機環境預設

1、測試環境說明

測試使用的Kubernetes集群可由一個master主機及一個以上(建議至少兩個)node主機組成,這些主機可以是物理服務器,也可以運行於vmware、virtualbox或kvm等虛擬化平台上的虛擬機,甚至是公有雲上的VPS主機。

本測試環境將由master01、node01和node02三個獨立的主機組成,它們分別擁有4核心的CPU及4G的內存資源,操作系統環境均為CentOS 7.5 1804,域名為ilinux.io。此外,各主機需要預設的系統環境如下:

    (1)借助於NTP服務設定各節點時間精確同步;
    (2)通過DNS完成各節點的主機名稱解析,測試環境主機數量較少時也可以使用hosts文件進行;
    (3)關閉各節點的iptables或firewalld服務,並確保它們被禁止隨系統引導過程啟動;
    (4)各節點禁用SELinux; 
    (5)各節點禁用所有的Swap設備;
    (6)若要使用ipvs模型的proxy,各節點還需要載入ipvs相關的各模塊;
    
2、設定時鍾同步
    
    若節點可直接訪問互聯網,直接啟動chronyd系統服務,並設定其隨系統引導而啟動。
    
        ~]# systemctl start chronyd.service
        ~]# systemctl enable chronyd.service        
    
    不過,建議用戶配置使用本地的的時間服務器,在節點數量眾多時尤其如此。存在可用的本地時間服務器時,修改節點的/etc/crhony.conf配置文件,並將時間服務器指向相應的主機即可,配置格式如下:
    
        server CHRONY-SERVER-NAME-OR-IP iburst
        
3、主機名稱解析

    出於簡化配置步驟的目的,本測試環境使用hosts文件進行各節點名稱解析,文件內容如下所示:
    
172.20.101.41 master01.ilinux.io master01
172.20.102.64 node01.ilinux.io node01
172.20.102.78 node02.ilinux.io node02
172.20.102.89 node03.ilinux.io node03
172.20.102.81 node04.ilinux.io node04
172.20.102.66 node05.ilinux.io node05
172.20.102.65 node06.ilinux.io node06
172.20.102.79 node07.ilinux.io node07

192.168.245.17 master.ilinux.io master
192.168.245.27 node01.ilinux.io node01
192.168.245.37 node02.ilinux.io node02
192.168.245.47 node03.ilinux.io node03


172.20.101.41 master.ilinux.io master
172.20.102.64 node01.ilinux.io node01
172.20.102.65 node02.ilinux.io node02
172.20.102.66 node03.ilinux.io node03
    
4、關閉iptables或firewalld服務

在CentOS7上,iptables或firewalld服務通常只會安裝並啟動一種,在不確認具體啟動狀態的前提下,這里通過同時關閉並禁用二者即可簡單達到設定目標。

    ~]# systemctl stop firewalld.service 
    ~]# systemctl stop iptables.service
    ~]# systemctl disable firewalld.service
    ~]# systemctl disable iptables.service

5、關閉並禁用SELinux

若當前啟用了SELinux,則需要編輯/etc/sysconfig/selinux文件,禁用SELinux,並臨時設置其當前狀態為permissive:

    ~]# sed -i 's@^SELINUX=SELINUX=.*@\1disabled@' /etc/sysconfig/selinux
    ~]# setenforce 0

6、禁用Swap設備

部署集群時,kubeadm默認會預先檢查當前主機是否禁用了Swap設備,並在未禁用時強制終止部署過程。因此,在主機內存資源充裕的條件下,需要禁用所有的Swap設備,否則,就需要在后文的kubeadm init及kubeadm join命令執行時額外使用相關的選項忽略檢查錯誤。

關閉Swap設備,需要分兩步完成。首先是關閉當前已啟用的所有Swap設備:
    ~]# swapoff -a
        
而后編輯/etc/fstab配置文件,注釋用於掛載Swap設備的所有行。
    
7、啟用ipvs內核模塊

創建內核模塊載入相關的腳本文件/etc/sysconfig/modules/ipvs.modules,設定自動載入的內核模塊。文件內容如下:

#!/bin/bash
ipvs_mods_dir="/usr/lib/modules/$(uname -r)/kernel/net/netfilter/ipvs"
for mod in $(ls $ipvs_mods_dir | grep -o "^[^.]*"); do
    /sbin/modinfo -F filename $mod  &> /dev/null
    if [ $? -eq 0 ]; then
        /sbin/modprobe $mod
    fi
done
 
修改文件權限,並手動為當前系統加載內核模塊:
    ~]# chmod +x /etc/sysconfig/modules/ipvs.modules 
    ~]# bash /etc/sysconfig/modules/ipvs.modules  

二、安裝程序包(在各主機上完成如下設定) 

1、生成yum倉庫配置
        
首先獲取docker-ce的配置倉庫配置文件:
        ~]# wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker.repo
            
而后手動生成kubernetes的yum倉庫配置文件/etc/yum.repos.d/kubernetes.repo,內容如下:
        
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
enabled=1
        
2、安裝相關的程序包

Kubernetes會對經過充分驗正的Docker程序版本進行認證,目前認證完成的最高版本是17.03,但docker-ce的最新版本已經高出了幾個版本號。管理員可忽略此認證而直接使用最新版本的docker-ce程序,不過,建議根據后面的說明,將安裝命令替換為安裝17.03版。
 
    ~]# yum install -y docker-ce 
    ~]# yum install -y kubelet kubeadm kubectl
    
    如果要安裝目前經過Kubernetes認證的docker-17版本,可以將上面第一條安裝命令替換為如下命令:
    ~]# yum install -y --setopt=obsoletes=0 docker-ce-17.03.2.ce docker-ce-selinux-17.03.2.ce

三、啟動docker服務(在各節點執行)

若要通過默認的k8s.gcr.io鏡像倉庫獲取Kubernetes系統組件的相關鏡像,需要配置docker Unit File(/usr/lib/systemd/system/docker.service文件)中的Environment變量,為其定義合用的HTTPS_PROXY,格式如下:
    
Environment="HTTPS_PROXY=http://ik8s.io:10070"
Environment="NO_PROXY=192.168.100.0/24,127.0.0.0/8"
        
另外,docker自1.13版起會自動設置iptables的FORWARD默認策略為DROP,這可能會影響Kubernetes集群依賴的報文轉發功能,因此,需要在docker服務啟動后,重新將FORWARD鏈的默認策略設備為ACCEPT,方式是修改/usr/lib/systemd/system/docker.service文件,在“ExecStart=/usr/bin/dockerd”一行之后新增一行如下內容:
ExecStartPost=/usr/sbin/iptables -P FORWARD ACCEPT
        
重載完成后即可啟動docker服務:
    ~]# systemctl daemon-reload        
    ~]# systemctl start docker.service
            
而后設定docker和kubelet隨系統引導自動啟動:
    ~]# systemctl enable docker kubelet

四、初始化主節點(在master01上完成如下操作)
            
1、初始化master節點

若未禁用Swap設備,則需要編輯kubelet的配置文件/etc/sysconfig/kubelet,設置其忽略Swap啟用的狀態錯誤,內容如下:
    KUBELET_EXTRA_ARGS="--fail-swap-on=false"
    
(可選步驟)而后,在運行初始化命令之前先運行如下命令單獨獲取相關的鏡像文件,而后再運行后面的kubeadm init命令,以便於觀察到鏡像文件的下載過程。
    ~]# kubeadm config images pull
    
而后即可進行master節點初始化。kubeadm init命令支持兩種初始化方式,一是通過命令行選項傳遞關鍵的部署設定,另一個是基於yaml格式的專用配置文件,后一種允許用戶自定義各個部署參數。下面分別給出了兩種實現方式的配置步驟,建議讀者采用第二種方式進行。

初始化方式一:

運行如下命令完成master01節點的初始化:
    ~]# kubeadm init --kubernetes-version=v1.13.3 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --ignore-preflight-errors=Swap
    
命令中的各選項簡單說明如下:
    (1) --kubernetes-version選項的版本號用於指定要部署的Kubenretes程序版本,它需要與當前的kubeadm支持的版本保持一致;
    (2) --pod-network-cidr選項用於指定分Pod分配使用的網絡地址,它通常應該與要部署使用的網絡插件(例如flannel、calico等)的默認設定保持一致,10.244.0.0/16是flannel默認使用的網絡;
    (3) --service-cidr用於指定為Service分配使用的網絡地址,它由kubernetes管理,默認即為10.96.0.0/12;
    (4) 最后一個選項“--ignore-preflight-errors=Swap”僅應該在未禁用Swap設備的狀態下使用。        

初始化方式二:

kubeadm也可通過配置文件加載配置,以定制更豐富的部署選項。以下是個符合前述命令設定方式的使用示例,不過,它明確定義了kubeProxy的模式為ipvs,並支持通過修改imageRepository的值修改獲取系統鏡像時使用的鏡像倉庫。

apiVersion: kubeadm.k8s.io/v1alpha2
kind: MasterConfiguration
kubernetesVersion: v1.13.3
api:
  advertiseAddress: 172.20.0.71
  bindPort: 6443
  controlPlaneEndpoint: ""
imageRepository: k8s.gcr.io
kubeProxy:
  config:
    mode: "ipvs"
    ipvs:
      ExcludeCIDRs: null
      minSyncPeriod: 0s
      scheduler: ""
      syncPeriod: 30s    
kubeletConfiguration:
  baseConfig:
    cgroupDriver: cgroupfs
    clusterDNS:
    - 10.96.0.10
    clusterDomain: cluster.local
    failSwapOn: false
    resolvConf: /etc/resolv.conf
    staticPodPath: /etc/kubernetes/manifests
networking:
  dnsDomain: cluster.local
  podSubnet: 10.244.0.0/16
  serviceSubnet: 10.96.0.0/12
  
將上面的內容保存於配置文件中,例如kubeadm-config.yaml,而后執行相應的命令:
    
   ~]# kubeadm init --config kubeadm-config.yaml --ignore-preflight-errors=Swap

            
注意:對於Kubernetes系統的新用戶來說,無論使用上述哪種方法,命令運行結束后,請記錄最后的kubeadm join命令輸出的最后提示的操作步驟。下面的內容是需要用戶記錄的一個命令輸出示例,它提示了后續需要的操作步驟:

    Your Kubernetes master 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

    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 machines by running the following on each node
    as root:

        kubeadm join 172.20.0.71:6443 --token gwxgdg.igg5728t1vt8ahhx --discovery-token-ca-cert-hash sha256:9b63cd1530b50da4733d2e7dace9270782211e25ec2e4bbac395e59adc56a26c
            
另外,kubeadm init命令完整參考指南請移步官方文檔。https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm-init/。
           
2、初始化kubectl

kubectl是kube-apiserver的命令行客戶端程序,實現了除系統部署之外的幾乎全部的管理操作,是kubernetes管理員使用最多的命令之一。kubectl需經由API server認證及授權后方能執行相應的管理操作,kubeadm部署的集群為其生成了一個具有管理員權限的認證配置文件/etc/kubernetes/admin.conf,它可由kubectl通過默認的“$HOME/.kube/config”的路徑進行加載。當然,用戶也可在kubectl命令上使用--kubeconfig選項指定一個別的位置。

下面復制認證為Kubernetes系統管理員的配置文件至目標用戶(例如當前用戶root)的家目錄下:

    ~]# mkdir ~/.kube 
    ~]# cp /etc/kubernetes/admin.conf ~/.kube/config
                
而后,即可通過kubectl進行客戶端命令測試,並借此了解集群組件的當前狀態:
    ~]# kubectl get componentstatus
    
一個正常的輸出應該類似如下輸出結果所示:
    NAME                 STATUS    MESSAGE              ERROR
    controller-manager   Healthy   ok                   
    scheduler            Healthy   ok                   
    etcd-0               Healthy   {"health": "true"}
   
3、添加flannel網絡附件

Kubernetes系統上Pod網絡的實現依賴於第三方插件進行,這類插件有近數十種之多,較為著名的有flannel、calico、canal和kube-router等,簡單易用的實現是為CoreOS提供的flannel項目。下面的命令用於在線部署flannel至Kubernetes系統之上:

    ~]# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
    
而后使用如下命令確認其輸出結果中Pod的狀態為“Running”,類似如下所示:

    ~]# kubectl get pods -n kube-system -l app=flannel
    NAME                          READY   STATUS    RESTARTS   AGE
    kube-flannel-ds-amd64-wscnz   1/1     Running   0          14m
            
4、驗正master節點已經就緒

    ~]# kubectl get nodes
    
上述命令應該會得到類似如下輸出:    
    NAME                 STATUS   ROLES    AGE    VERSION
    master01.ilinux.io   Ready    master   4m9s   v1.13.3    

五、添加節點到集群中(在node01和node02上分別完成如下操作)

1、若未禁用Swap設備,編輯kubelet的配置文件/etc/sysconfig/kubelet,設置其忽略Swap啟用的狀態錯誤,內容如下:
    KUBELET_EXTRA_ARGS="--fail-swap-on=false"

2、將節點加入第二步中創建的master的集群中,要使用主節點初始化過程中記錄的kubeadm join命令,並且在未禁用Swap設備的情況下,額外附加“--ignore-preflight-errors=Swap”選項;

    ~]# kubeadm join 172.20.0.71:6443 --token gwxgdg.igg5728t1vt8ahhx --discovery-token-ca-cert-hash sha256:9b63cd1530b50da4733d2e7dace9270782211e25ec2e4bbac395e59adc56a26c --ignore-preflight-errors=Swap
   
在每個節點添加完成后,即可通過kubectl驗正添加結果。下面的命令及其輸出是在node01和node02均添加完成后運行的,其輸出結果表明兩個Node已經准備就緒。

    ~]# kubectl get nodes
    NAME                  STATUS   ROLES    AGE     VERSION
    master01.magedu.com   Ready    master   31m     v1.13.3
    node01.magedu.com     Ready    <none>   3m8s    v1.13.3
    node02.magedu.com     Ready    <none>   2m25s   v1.13.3

到此為止,一個master,並附帶有兩個node的kubernetes集群基礎設施已經部署完成,用戶隨后即可測試其核心功能。例如,下面的命令可將myapp以Pod的形式編排運行於集群之上,並通過在集群外部進行訪問:

    ~]# kubectl create deployment myapp --image=ikubernetes/myapp:v1
    ~]# kubectl create service nodeport myapp --tcp=80:80

而后,使用如下命令了解Service對象myapp使用的NodePort,以便於在集群外部進行訪問:
    ~]# kubectl get svc -l app=myapp
    NAME    TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
    myapp   NodePort   10.102.254.75   <none>        80:31257/TCP   2m32s    
    
myapp是一個web應用,因此,用戶可以於集群外部通過“http://NodeIP:31257”這個URL訪問myapp上的應用,例如於集群外通過瀏覽器訪問“http://172.20.0.61:31257”。

master history

31  2019-02-17 14:39:14 root yum repolist
   32  2019-02-17 14:46:15 root vim /etc/hostname 
   33  2019-02-17 14:47:35 root vim /etc/hosts
   34  2019-02-17 14:49:33 root reboot 
   35  2019-02-17 14:49:33 root ping node01
   36  2019-02-17 14:50:32 root yum repolist
   37  2019-02-17 14:51:13 root wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker.repo
   38  2019-02-17 14:51:45 root free -m
   39  2019-02-17 14:51:57 root df -h
   40  2019-02-17 14:52:03 root fdisk 
   41  2019-02-17 14:52:21 root date
   42  2019-02-17 14:52:45 root systemctl stop firewalld.service
   43  2019-02-17 14:52:56 root systemctl stop iptables.service
   44  2019-02-17 14:53:15 root cat /etc/sysconfig/selinux
   45  2019-02-17 14:53:36 root swapoff -a
   46  2019-02-17 14:54:02 root vim /etc/sysconfig/modules/ipvs.modules
   47  2019-02-17 14:54:48 root scp  /etc/sysconfig/modules/ipvs.modules node01:/etc/sysconfig/modules/ipvs.modules
   48  2019-02-17 14:54:57 root scp  /etc/sysconfig/modules/ipvs.modules node02:/etc/sysconfig/modules/ipvs.modules
   49  2019-02-17 14:55:08 root scp  /etc/sysconfig/modules/ipvs.modules node03:/etc/sysconfig/modules/ipvs.modules
   50  2019-02-17 14:55:28 root chmod +x /etc/sysconfig/modules/ipvs.modules
   51  2019-02-17 14:55:47 root bash /etc/sysconfig/modules/ipvs.modules
   52  2019-02-17 14:56:12 root ls /etc/yum.repos.d/
   53  2019-02-17 14:56:25 root history 
   54  2019-02-17 14:56:58 root yum install -y docker-ce 
   55  2019-02-17 14:58:18 root yum install -y kubelet kubeadm kubectl
   56  2019-02-17 15:00:14 root rpm -q docker
   57  2019-02-17 15:00:24 root history 
   58  2019-02-17 15:00:29 root rpm -q docker-ce
   59  2019-02-17 15:00:33 root rpm -ql docker-ce
   60  2019-02-17 15:01:02 root vim /usr/lib/systemd/system/docker.service
   61  2019-02-17 15:03:31 root scp /usr/lib/systemd/system/docker.service node01:/usr/lib/systemd/system/docker.service
   62  2019-02-17 15:04:16 root scp /usr/lib/systemd/system/docker.service node02:/usr/lib/systemd/system/docker.service
   63  2019-02-17 15:04:25 root scp /usr/lib/systemd/system/docker.service node03:/usr/lib/systemd/system/docker.service
   64  2019-02-17 15:04:50 root systemctl daemon-reload
   65  2019-02-17 15:05:09 root systemctl start docker.service
   66  2019-02-17 15:05:25 root systemctl enable docker kubelet
   67  2019-02-17 15:07:04 root cat "--fail-swap-on=false"
   68  2019-02-17 15:07:20 root cat /etc/sysconfig/kubelet 
   69  2019-02-17 15:08:17 root kubeadm init --kubernetes-version=v1.13.3 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --ignore-preflight-errors=Swap --dry-run
   70  2019-02-17 15:10:19 root kubeadm config images list
   71  2019-02-17 15:11:01 root kubeadm config images pull
   72  2019-02-17 15:11:51 root docker image list
   73  2019-02-17 15:20:49 root lftp 172.18.0.1/pub
   74  2019-02-17 15:21:01 root yum install lftp
   75  2019-02-17 15:21:10 root lftp 172.18.0.1/pub
   76  2019-02-17 15:24:53 root ls
   77  2019-02-17 15:25:35 root docker load -i k8s-master-v1.13.3.tar 
   78  2019-02-17 15:26:27 root docker image list
   79  2019-02-17 15:27:24 root history 
   80  2019-02-17 15:27:37 root kubeadm init --kubernetes-version=v1.13.3 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --ignore-preflight-errors=Swap
   81  2019-02-17 15:28:41 root history 
   82  2019-02-17 15:29:36 root mkdir .kube
   83  2019-02-17 15:29:58 root cp /etc/kubernetes/admin.conf .kube/config
   84  2019-02-17 15:32:19 root kubectl get nodes
   85  2019-02-17 15:34:26 root kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
   86  2019-02-17 15:34:31 root kubectl get nodes
   87  2019-02-17 15:57:24 root kubectl get pods -n kube-system
   88  2019-02-17 16:23:04 root vim kubenetes-init.txt
   89  2019-02-17 16:24:43 root kubectl get nodes
   90  2019-02-17 16:28:42 root kubectl config view
   91  2019-02-17 16:29:37 root cd /etc/kubernetes/
   92  2019-02-17 16:29:39 root ls
   93  2019-02-17 16:30:12 root scp admin.conf node01:/root/.kube/config
   94  2019-02-17 16:30:20 root scp admin.conf node02:/root/.kube/config
   95  2019-02-17 16:30:53 root scp admin.conf node03:/root/.kube/config
   96  2019-02-17 16:32:33 root ss -nlt
   97  2019-02-17 16:33:41 root cd 
   98  2019-02-17 16:33:43 root history 
————————————————
版權聲明:本文為CSDN博主「ZZULI_Lucas」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/weixin_43551152/article/details/87970671


免責聲明!

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



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