Kubernetes學習---環境搭建篇

oliver-l發表於2021-11-08

最近開始學習了Kubernetes相關的知識,通過極客時間的深入剖析Kubernetes和慕課網相關的實戰課程,對Kubernetes也有了初步的瞭解,寫部落格也是記錄一下學習的過程。

下面開始Kubernetes的環境搭建

前置知識

  • 瞭解docker相關的知識
  • 瞭解Linux相關的知識
  • 瞭解一些常見的開發軟體如(nginx,mysql等)

環境說明

  • windows10作業系統
  • virtual box最新版
  • vagrant最新版
  • centos7

上面的涉及的軟體可在官網自行下載

這裡需要搭建Kubernetes叢集,所以需要使用virtual box建立多個虛擬機器,然後使用vagrant來管理多個虛擬機器。

虛擬機器環境搭建

通過vagrant建立三臺虛擬機器,分別為一個manager主節點和兩個node節點

下載centos的vagrant box並將box新增到本地

下載完成後新增box,執行vagrant box add centos/7 下載的box路徑新增相應的box

定義Vagrantfile檔案,檔案內容如下,檔案通過定義三個虛擬機器,分別為master,node1,node2。為其分配對應的靜態ip,記憶體,cpu核數。由於Kubernetes對節點的要求是最低不能小於2048M和cpu核數需大於等於2,所以這裡不能低於我給的配置。併為虛擬機器分配私有網路,在建立時執行setup.sh指令碼,用於在虛擬機器上下載docker

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

Vagrant.require_version ">= 1.6.0"

boxes = [
    {
        :name => "master",
        :eth1 => "192.168.205.10",
        :mem => "2048",
        :cpu => "2"
    },
    {
        :name => "node1",
        :eth1 => "192.168.205.11",
        :mem => "2048",
        :cpu => "2"
    },
    {
        :name => "node2",
        :eth1 => "192.168.205.12",
        :mem => "2048",
        :cpu => "2"
    }
]

Vagrant.configure(2) do |config|

  config.vm.box = "centos/7"

  boxes.each do |opts|
      config.vm.define opts[:name] do |config|
        config.vm.hostname = opts[:name]
        config.vm.provider "vmware_fusion" do |v|
          v.vmx["memsize"] = opts[:mem]
          v.vmx["numvcpus"] = opts[:cpu]
        end

        config.vm.provider "virtualbox" do |v|
          v.customize ["modifyvm", :id, "--memory", opts[:mem]]
          v.customize ["modifyvm", :id, "--cpus", opts[:cpu]]
        end

        config.vm.network :private_network, ip: opts[:eth1]
      end
  end

  config.vm.provision "shell", privileged: true, path: "./setup.sh"

end

setup.sh檔案內容如下:

#/bin/sh

# install some tools
sudo yum install -y git vim gcc glibc-static telnet bridge-utils

# install docker
curl -fsSL get.docker.com -o get-docker.sh
sh get-docker.sh

# start docker service
sudo groupadd docker
sudo gpasswd -a vagrant docker
sudo systemctl start docker
sudo systemctl enable docker.service
rm -rf get-docker.sh

然後執行vagrant up啟動虛擬機器,這裡可能要花費一些時間來建立虛擬機器和初始化環境

Kubernetes叢集搭建

虛擬機器啟動後,可通過vagrant ssh 虛擬機器名稱進入對應的虛擬機器

首先我們先進入master節點,在master節點上安裝Kubernetes叢集主節點

開啟br_netfilter

cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF

將橋接的IPV4流量傳遞到iptables(使用docker的話,不設定也沒什麼問題,因為dockerd會幫我們設定,但是如果使用containerd的話,就需要設定)

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

讓sysctl生效
sysctl --system

配置k8s的阿里雲源

cat >>/etc/yum.repos.d/kubernetes.repo <<EOF
[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

安裝kubelet、kubeadm、kubectl
yum install -y kubelet-1.19.3 kubeadm-1.19.3 kubectl-1.19.3

開機啟動
systemctl enable kubelet

在 master 上,設定 hostname
hostnamectl set-hostname master

配置/etc/hosts

192.168.205.10 master
192.168.205.11 node1
192.168.205.12 node2

初始化kubeadm

在初始化kubeadm之前,有一些注意項

注意點:節點配置最低為2核2G,所以在配置虛擬機器時,要配置最低為2核2G

建立/etc/docker/daemon.json檔案新增內容,設定docker驅動,並重啟docker服務

{
 "exec-opts": ["native.cgroupdriver=systemd"]
}

關閉swap,並在初始化時增加ignore-preflight-errors引數
swapoff -a
sed -ri 's/.*swap.*/#&/' /etc/fstab

使用 kubeadm 初始化 master 節點

  • kubeadm的本質把 kubelet 直接執行在宿主機上,然後使用容器部署其他的 Kubernetes 元件。

  • 使用 kubeadm 的第一步,是在機器上手動安裝 kubeadm、kubelet 和 kubectl 這三個二進位制檔案。

  • 當你執行 kubeadm init 指令後,kubeadm 首先要做的,是一系列的檢查工作,以確定這臺機器可以用來部署 Kubernetes。這一步檢查,我們稱為“Preflight Checks”,它可以為你省掉很多後續的麻煩。

  • 在通過了 Preflight Checks 之後,kubeadm 要為你做的,是生成 Kubernetes 對外提供服務所需的各種證照和對應的目錄。

  • 接下來,kubeadm 會為 Master 元件生成 Pod 配置檔案。

  • 然後,kubeadm 就會為叢集生成一個 bootstrap token。在後面,只要持有這個 token,任何一個安裝了 kubelet 和 kubadm 的節點,都可以通過 kubeadm join 加入到這個叢集當中。

  • kubeadm init 的最後一步,就是安裝預設外掛。Kubernetes 預設 kube-proxy 和 DNS 這兩個外掛是必須安裝的。它們分別用來提供整個叢集的服務發現和 DNS 功能。其實,這兩個外掛也只是兩個容器映象而已,所以 kubeadm 只要用 Kubernetes 客戶端建立兩個 Pod 就可以了。

kubeadm init --kubernetes-version=1.19.3
 --apiserver-advertise-address=192.168.205.10 \ --image-repository registry.aliyuncs.com/google_containers \ --service-cidr=10.1.0.0/16 \ --pod-network-cidr=10.244.0.0/16 

注意:–kubernetes-version 為上面安裝時的 kubernetes 版本,–apiserver-advertise-address 為 master 節點的 ip 地址

看到successful! 說明已經成功了

Kubernetes學習---環境搭建篇

配置kube環境

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

Kubernetes叢集預設需要加密方式訪問。所以,這幾條命令,就是將剛剛部署生成的Kubernetes 叢集的安全配置檔案,儲存到當前使用者的.kube目錄下,kubectl預設會使用這個目錄下的授權資訊訪問Kubernetes叢集。

如果不這麼做的話,我們每次都需要通過 export KUBECONFIG 環境變數告訴 kubectl 這個安全配置檔案的位置。

配置kubeconfig環境變數

echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >>~/.bash_profile

使配置生效

source ~/.bash_profile

驗證一下,看到以下資訊,說明配置已經生效,但是當前叢集的master節點仍未生效,處於NotReady狀態,原因是我們還沒有安裝網路元件

[vagrant@master ~]$ kubectl get node
NAME            STATUS     ROLES    AGE   VERSION
master         NotReady   master   45m   v1.19.3
[vagrant@master ~]$

在 Kubernetes 專案“一切皆容器”的設計理念指導下,部署網路外掛非常簡單,只需要執行一句 kubectl apply 指令

安裝calico網路元件,calico.yaml可以直接到calico官網下載到虛擬機器後,執行以下命令

kubectl apply -f calico.yaml

再次檢視節點

[vagrant@master ~]$ kubectl get node
NAME            STATUS   ROLES    AGE   VERSION
master          Ready    master   48m   v1.19.3
[vagrant@master ~]$

檢視一下kubernetes都執行了哪些pod

Kubernetes學習---環境搭建篇

到目前為止,已經配置好了master主節點,下面再來配置node節點

node節點配置

進入node1節點,與之前master節點操作類似,要先安裝好對應的環境,就是初始化kubeadm之前的操作

通過剛剛在master節點初始化成功後的顯示的kubeadm join命令,使node節點能加入叢集中

拷貝kubeadm join加入叢集命令,可通過命令kubeadm token create –print-join-command檢視:

kubeadm join 192.168.205.10:6443 --token d3jpig.rv554dxknrb3ptsd     --discovery-token-ca-cert-hash sha256:3cab09ca90964bd8f74952ae572b6f8ee79b4ca09e6b09fdbcad1883bb8e2b15

加入叢集后,可以在 master 再次檢視節點,可以檢視到node1節點已加入叢集

[vagrant@master ~]$ kubectl get node
NAME     STATUS   ROLES    AGE   VERSION
master   Ready    master   34m   v1.19.3
node1    Ready    <none>   64s   v1.19.3

node2節點與node1節點操作一致,完成操作後,就正式完成了叢集的初始化操作,可以正式開始學習Kubernetes了。

Kubernetes學習---環境搭建篇

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章