最近開始學習了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、kubectlyum install -y kubelet-1.19.3 kubeadm-1.19.3 kubectl-1.19.3
開機啟動systemctl enable kubelet
在 master 上,設定 hostnamehostnamectl 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! 說明已經成功了
配置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
到目前為止,已經配置好了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了。
本作品採用《CC 協議》,轉載必須註明作者和本文連結