1. 程式人生 > 其它 >Mac上自動化搭建k8s叢集

Mac上自動化搭建k8s叢集

技術標籤:k8s

1.安裝部署架構
Mac上搭建三個虛擬機器組成k8s叢集
2.安裝virtualbox
下載地址:https://www.virtualbox.org/wiki/Downloads
3.安裝vagrant
下載地址:https://www.vagrantup.com/downloads

//檢查安裝結果
[email protected] ~ % vagrant version
Installed Version: 2.2.14
Latest Version: 2.2.14
You're running an up-to-date version of Vagrant!
[email protected]
~ %

4.在瀏覽器中開啟https://app.vagrantup.com/centos/boxes/7/versions/1905.1/providers/virtualbox.box下載box映象並將其移動至/Users/sunxi/Documents/application/vagrant/box/目錄下
5.使用下面命令新增box映象

vagrant box add --name centos/7 /Users/sunxi/Documents/application/vagrant/box/CentOS-7-x86_64-Vagrant-1905_01.VirtualBox.box

結果顯示如下:

[email protected]
box % vagrant box add --name centos/7 /Users/sunxi/Documents/application/vagrant/box/CentOS-7-x86_64-Vagrant-1905_01.VirtualBox.box ==> box: Box file was not detected as metadata. Adding it directly... ==> box: Adding box 'centos/7' (v0) for provider: box: Unpacking necessary files from: file:///Users/sunxi/
Documents/application/vagrant/box/CentOS-7-x86_64-Vagrant-1905_01.VirtualBox.box ==> box: Successfully added box 'centos/7' (v0) for 'virtualbox'! [email protected] box %

6.使用下面命令檢查新增結果:

vagrant box list

結果如下:

[email protected] box % vagrant box list
centos/7 (virtualbox, 0)
[email protected] box % 

7.搭建k8s叢集
(1)建立/Users/sunxi/Documents/application/k8s目錄並在該目錄下執行命令:

 git clone https://github.com/zhan-yl/kubernetes.git

(2)進入進入kubernetes/vagrant-provisioning目錄並開啟Vagrantfile檔案,該檔案定義了1個master和2個worker節點及節點的資源配置,這裡可以根據實際情況進行修改

# -*- mode: ruby -*-
# vi: set ft=ruby :

ENV['VAGRANT_NO_PARALLEL'] = 'yes'

Vagrant.configure(2) do |config|

  config.vm.provision "shell", path: "bootstrap.sh"

  # Kubernetes Master Server
  config.vm.define "kmaster" do |kmaster|
    kmaster.vm.box = "centos/7"
    kmaster.vm.hostname = "kmaster.example.com"
    kmaster.vm.network "private_network", ip: "172.42.42.100"
    kmaster.vm.provider "virtualbox" do |v|
      v.name = "kmaster"
      v.memory = 1024
      v.cpus = 1
      # Prevent VirtualBox from interfering with host audio stack
      v.customize ["modifyvm", :id, "--audio", "none"]
    end
    kmaster.vm.provision "shell", path: "bootstrap_kmaster.sh"
  end

  NodeCount = 2

  # Kubernetes Worker Nodes
  (1..NodeCount).each do |i|
    config.vm.define "kworker#{i}" do |workernode|
      workernode.vm.box = "centos/7"
      workernode.vm.hostname = "kworker#{i}.example.com"
      workernode.vm.network "private_network", ip: "172.42.42.10#{i}"
      workernode.vm.provider "virtualbox" do |v|
        v.name = "kworker#{i}"
        v.memory = 2048
        v.cpus = 2
        # Prevent VirtualBox from interfering with host audio stack
        v.customize ["modifyvm", :id, "--audio", "none"]
      end
      workernode.vm.provision "shell", path: "bootstrap_kworker.sh"
    end
  end

end

(3)進入kubernetes/vagrant-provisioning目錄執行vagrant up命令完成k8s叢集搭建、配置及啟動
執行這一步時,曝出如下錯誤:

[email protected] vagrant-provisioning % vagrant up
Bringing machine 'kmaster' up with 'virtualbox' provider...
Bringing machine 'kworker1' up with 'virtualbox' provider...
Bringing machine 'kworker2' up with 'virtualbox' provider...
==> kmaster: Importing base box 'centos/7'...
==> kmaster: Matching MAC address for NAT networking...
==> kmaster: Setting the name of the VM: kmaster
==> kmaster: Clearing any previously set network interfaces...
==> kmaster: Preparing network interfaces based on configuration...
    kmaster: Adapter 1: nat
    kmaster: Adapter 2: hostonly
==> kmaster: Forwarding ports...
    kmaster: 22 (guest) => 2222 (host) (adapter 1)
==> kmaster: Running 'pre-boot' VM customizations...
==> kmaster: Booting VM...
==> kmaster: Waiting for machine to boot. This may take a few minutes...
    kmaster: SSH address: 127.0.0.1:2222
    kmaster: SSH username: vagrant
    kmaster: SSH auth method: private key
    kmaster: 
    kmaster: Vagrant insecure key detected. Vagrant will automatically replace
    kmaster: this with a newly generated keypair for better security.
    kmaster: 
    kmaster: Inserting generated public key within guest...
    kmaster: Removing insecure key from the guest if it's present...
    kmaster: Key inserted! Disconnecting and reconnecting using new SSH key...
==> kmaster: Machine booted and ready!
==> kmaster: Checking for guest additions in VM...
    kmaster: No guest additions were detected on the base box for this VM! Guest
    kmaster: additions are required for forwarded ports, shared folders, host only
    kmaster: networking, and more. If SSH fails on this machine, please install
    kmaster: the guest additions and repackage the box to continue.
    kmaster: 
    kmaster: This is not an error message; everything may continue to work properly,
    kmaster: in which case you may ignore this message.
==> kmaster: Setting hostname...
==> kmaster: Configuring and enabling network interfaces...
==> kmaster: Rsyncing folder: /Users/sunxi/Documents/application/k8s/kubernetes/vagrant-provisioning/ => /vagrant
==> kmaster: Running provisioner: shell...
    kmaster: Running: /var/folders/cp/_6lr4gqs1bvc70crzvbknk8c0000gn/T/vagrant-shell20210204-82021-apbxe7.sh
    kmaster: [TASK 1] Update /etc/hosts file
    kmaster: [TASK 2] Install docker container engine
    kmaster: [TASK 3] Enable and start docker service
    kmaster: [TASK 4] Disable SELinux
    kmaster: [TASK 5] Stop and Disable firewalld
    kmaster: [TASK 6] Add sysctl settings
    kmaster: [TASK 7] Disable and turn off SWAP
    kmaster: [TASK 8] Add yum repo file for kubernetes
    kmaster: [TASK 9] Install Kubernetes (kubeadm, kubelet and kubectl)
    kmaster: [TASK 10] Enable and start kubelet service
    kmaster: [TASK 11] Enable ssh password authentication
    kmaster: [TASK 12] Set root password
    kmaster: [TASK 13] Set TimeZone
==> kmaster: Running provisioner: shell...
    kmaster: Running: /var/folders/cp/_6lr4gqs1bvc70crzvbknk8c0000gn/T/vagrant-shell20210204-82021-1trwtkz.sh
    kmaster: [TASK 1] Initialize Kubernetes Cluster
    kmaster: [TASK 2] Copy kube admin config to Vagrant user .kube directory
    kmaster: cp: cannot stat ‘/etc/kubernetes/admin.conf’: No such file or directory
    kmaster: [TASK 3] Deploy flannel network
    kmaster: The connection to the server localhost:8080 was refused - did you specify the right host or port?
    kmaster: [TASK 4] Generate and save cluster join command to /joincluster.sh
    kmaster: failed to load admin kubeconfig: open /root/.kube/config: no such file or directory
    kmaster: To see the stack trace of this error execute with --v=5 or higher
The SSH command responded with a non-zero exit status. Vagrant
assumes that this means the command failed. The output for this command
should be in the log above. Please read the output to determine what
went wrong.

故障排查:
  首先登入到master節點上確認有沒有/etc/kubernetes/admin.conf檔案,檢查結果沒有,所以判斷是在執行叢集初始化的時候出現的問題,然後在bootstrap_kmaster.sh指令碼中找到叢集初始化的命令kubeadm init --apiserver-advertise-address=172.42.42.100 --pod-network-cidr=10.244.0.0/16 --image-repository=registry.aliyuncs.com/google_containers --kubernetes-version=v1.18.3並在master節點上單獨執行發現以下報錯:

在這裡插入圖片描述

  接著調整master節點的資源配置,執行vagrant halt關閉虛擬機器叢集,通過virtualbox刪除master並執行vagrant up重新搭建k8s叢集即可。這裡需要注意下,我在搭建過程中發現其指令碼自動安裝的kubelet、kubectl和kubeadm都是最新版本,即1.20.2,所以我將初始化叢集命令的引數–kubernetes-version修改為1.20.2與kubelet、kubectl和kubeadm保持一致。

(4)使用vagrant status檢查虛擬機器執行狀態

[email protected] vagrant-provisioning % vagrant status
Current machine states:

kmaster                   running (virtualbox)
kworker1                  running (virtualbox)
kworker2                  running (virtualbox)

This environment represents multiple VMs. The VMs are all listed
above with their current state. For more information about a specific
VM, run `vagrant status NAME`.

(5)檢視叢集資訊

//登入master節點
vagrant ssh kmaster
[[email protected] ~]$ kubectl cluster-info
Kubernetes control plane is running at https://172.42.42.100:6443
KubeDNS is running at https://172.42.42.100:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

(6)獲取節點狀態

[[email protected] ~]$ kubectl get no
NAME                   STATUS   ROLES                  AGE   VERSION
kmaster.example.com    Ready    control-plane,master   34m   v1.20.2
kworker1.example.com   Ready    <none>                 25m   v1.20.2
kworker2.example.com   Ready    <none>                 22m   v1.20.2

(7)獲取系統元件狀態

[[email protected] ~]$ kubectl get -n kube-system all
NAME                                              READY   STATUS    RESTARTS   AGE
pod/coredns-7f89b7bc75-hjjcm                      1/1     Running   0          34m
pod/coredns-7f89b7bc75-vzddj                      1/1     Running   0          34m
pod/etcd-kmaster.example.com                      1/1     Running   0          34m
pod/kube-apiserver-kmaster.example.com            1/1     Running   0          34m
pod/kube-controller-manager-kmaster.example.com   1/1     Running   0          34m
pod/kube-flannel-ds-amd64-7sbmg                   1/1     Running   0          25m
pod/kube-flannel-ds-amd64-c4vw9                   1/1     Running   0          30m
pod/kube-flannel-ds-amd64-dvpdk                   1/1     Running   0          22m
pod/kube-proxy-brkxl                              1/1     Running   0          34m
pod/kube-proxy-dscmw                              1/1     Running   0          25m
pod/kube-proxy-s8xmt                              1/1     Running   0          22m
pod/kube-scheduler-kmaster.example.com            1/1     Running   0          34m

NAME               TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)                  AGE
service/kube-dns   ClusterIP   10.96.0.10   <none>        53/UDP,53/TCP,9153/TCP   34m

NAME                                   DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR            AGE
daemonset.apps/kube-flannel-ds-amd64   3         3         3       3            3           <none>                   30m
daemonset.apps/kube-proxy              3         3         3       3            3           kubernetes.io/os=linux   34m

NAME                      READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/coredns   2/2     2            2           34m

NAME                                 DESIRED   CURRENT   READY   AGE
replicaset.apps/coredns-7f89b7bc75   2         2         2       34m

(8)部署nginx應用檢查叢集安裝是否存在問題

[[email protected] ~]$ kubectl create deployment nginx --image=nginx
deployment.apps/nginx created
//暴露服務埠:
[[email protected] ~]$ kubectl expose deployment nginx --port=80 --type=NodePort
service/nginx exposed
//檢查nginx pod及服務的狀態:
[[email protected] ~]$ kubectl get pod,svc -o wide
NAME                         READY   STATUS    RESTARTS   AGE   IP           NODE                   NOMINATED NODE   READINESS GATES
pod/nginx-6799fc88d8-bm7sg   1/1     Running   0          16m   10.244.2.2   kworker2.example.com   <none>           <none>

NAME                 TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE   SELECTOR
service/kubernetes   ClusterIP   10.96.0.1      <none>        443/TCP        51m   <none>
service/nginx        NodePort    10.103.76.79   <none>        80:32399/TCP   16m   app=nginx
//訪問nginx服務:
[[email protected] ~]$ curl kworker2.example.com:32399
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

8.vagrant常見的使用命令:

命令含義
vagrant up啟動虛擬機器
vagrant halt關閉虛擬機器
vagrant status檢查虛擬機器狀態
vagrant sshssh到虛擬機器
vagrant box list列出所有box列表
vagrant version獲取vagrant版本

注意:整個自動化安裝部署指令碼中沒有新增驗證環節,所以在叢集搭建完成後需要部署應用驗證是否成功