《前端運維》五、k8s--1安裝與基本配置

Zaking發表於2022-03-28

 一、k8s基礎概念與安裝

  k8s,即kubernetes是用於自動部署,擴充套件和管理容器化應用程式的開源系統。詳細的描述就不多說了,官網有更詳細的內容。簡單來說,k8s,是一個可以操作多臺機器排程部署映象的平臺。在k8s中,可以使用叢集來組織伺服器。叢集中會存在一個master節點,該節點是kubernetes的控制節點,負責排程伺服器中被稱為Node的其他資源。

  下面,我們就正式開始k8s的學習。

  首先,我們需要兩臺伺服器,一個是master,一個是node。master伺服器的配置要稍微高些,2核4G就差不多了,如果不是長時間用的話,可以買按量付費,用完了給它關了就好了。

  購買好伺服器後,我們需要給兩臺伺服器預先安裝一些依賴工具:

yum install vim wget ntpdate -y

  vim和wget就不說了,之前的內容也都有使用過,ntpdate是用來同步時區的。然後,我們還需要關閉防火牆,因為k8s會建立防火牆規則:

systemctl stop firewalld & systemctl disable firewalld

  然後,關閉swap分割槽,Swap 是 Linux 的交換分割槽,在系統資源不足時,Swap 分割槽會啟用,這個我們不需要。應該讓新建立的服務自動排程到叢集的其他 Node 節點中去,而不是使用 Swap 分割槽。

#臨時關閉
swapoff -a

  關閉Selinux,這是為了支援容器可以訪問宿主機檔案系統。

# 暫時關閉 selinux
setenforce 0

# 永久關閉
vi /etc/sysconfig/selinux
# 修改以下引數,設定為disable
SELINUX=disabled

  下面我們就需要使用nptdate來統一我們的系統時間和時區,伺服器時間與阿里雲伺服器對齊。

# 統一時區,為上海時區
ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
bash -c "echo 'Asia/Shanghai' > /etc/timezone"

# 統一使用阿里伺服器進行時間更新
ntpdate ntp1.aliyun.com

  下一步我們來安裝docker:

yum install -y yum-utils device-mapper-persistent-data lvm2


sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install docker-ce -y
systemctl start docker
systemctl enable docker

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://fwvjnv59.mirror.aliyuncs.com"]
}
EOF

sudo systemctl daemon-reload
sudo systemctl restart docker.service

  上面的:

  • device-mapper-persistent-data: 儲存驅動,Linux上的許多高階卷管理技術
  • lvm: 邏輯卷管理器,用於建立邏輯磁碟分割槽使用  

  然後,我們來安裝kubernetes元件,首先,切換阿里雲:

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
        http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

  然後,安裝kubernetes元件:

yum install -y kubelet kubeadm kubectl
# 啟動kubelet
systemctl enable kubelet && systemctl start kubelet
  • kubelet 是 Kubernetes 中的核心元件。它會執行在叢集的所有節點上,並負責建立啟動服務容器
  • kubectl 則是Kubernetes的命令列工具。可以用來管理,刪除,建立資源
  • kubeadm 則是用來初始化叢集,子節點加入的工具

  最後,我們需要設定一下bridge-nf-call-iptables:

echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables

  安裝的部分就完成啦。下面我們來配置一些基本內容吧

二、基本配置

 1)master節點安裝

  之前說過,需要兩臺伺服器,一臺master,一臺node。我們先來安裝master伺服器的基本依賴。我們首先修改下主機名:

hostnamectl set-hostname  master

  然後我們來修改下master伺服器的host,使兩臺伺服器可以通訊:

ip addr
vim /etc/hosts

172.31.178.169  master  master

  在上面的檔案中,把node伺服器的ip新增進去即可。然後我們需要配置下初始檔案:

kubeadm config print init-defaults > init-kubeadm.conf
vim init-kubeadm.conf

  init-defaults命令,會生成一份初始檔案。下面我們需要在init-kubeadm.conf檔案中進行一些額外的,必要的更改:

- imageRepository: k8s.gcr.io 更換k8s映象倉庫
+ imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers
- localAPIEndpointc,advertiseAddress為master ip ,port預設不修改
localAPIEndpoint:
+ advertiseAddress: 172.31.178.169  # 此處為master的IP
  bindPort: 6443
# 配置子網路
networking:
  dnsDomain: cluster.local
  serviceSubnet: 10.96.0.0/12
+ podSubnet: 10.244.0.0/16    # 新增這個

  上面修改的程式碼修改了映象倉庫為阿里雲的,加速元件的拉取,替換ip為自己主機的ip,配置pod網路為flannel網段,後面為了讓叢集之間可以互相通訊,需要配置子網路,這些在後面的flannel網路中會用到。10.96.0.0/12 是Kubernetes內部的網路pods需要的網路。10.244.0.0/16 是Kubernetes內部services需要的網路。

  下面我們就需要拉取一下元件:

// 檢視缺少的元件
kubeadm config images list --config init-kubeadm.conf
// 拉取缺少的元件
kubeadm config images pull --config init-kubeadm.conf

  直接執行這兩個命令,就可以檢視、拉取缺少的元件了。我們來簡單瞭解下,這些元件都是幹什麼的:

  • kubeadm 可以用來拉取我們的預設元件映象
  • kube-apiserver 提供介面服務,可以讓外網訪問叢集
  • kube-controller-manager 內部的控制指令工具
  • kube-scheduler 內部的任務排程器
  • kube-proxy 反向代理和負載均衡,流量轉發
  • pause 程式管理工具
  • etcd 保持 叢集內部的資料一致性
  • coredns 叢集內網通訊

  

  我們也可以通過上圖,來理解下k8s的執行流程。下面我們來初始化k8s:

kubeadm init --config init-kubeadm.conf

  然後,我們需要執行的命令內容,k8s做了一部分提示:

Your Kubernetes control-plane 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

Alternatively, if you are the root user, you can run:

  export KUBECONFIG=/etc/kubernetes/admin.conf

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/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 172.31.178.169:6443 --token abcdef.0123456789abcdef \
    --discovery-token-ca-cert-hash sha256:8aac19f4dbe68f1e15ba3d80e141acdc912e353f9757ad69187e8fb9780bc975 

  我們根據提示執行就好了。下面我們來安裝下flannel,flannel 主要的作用是通過建立一個虛擬網路,讓不同節點下的服務有著全域性唯一的IP地址,且服務之前可以互相訪問和連線。叢集內網網路通訊協議通訊模式採用了Flannel協議:

  

wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
docker pull quay.io/coreos/flannel:v0.13.0-rc2
kubectl apply -f kube-flannel.yml

  下面我們要修改下net-conf.json檔案,把其中的Network網段,配置的跟之前的pod網段一樣即可:

{ "Network": "10.244.0.0/16", "Backend": { "Type": "vxlan" } }

  然後我們就可以通過下面的命令檢視下啟動情況:

kubectl get nodes

  master節點的配置到這裡就基本oK了,下面我們來看下node節點的配置,首先同樣的,我們先修改下主機名:

hostnamectl set-hostname node1

  然後將master節點的配置檔案拷貝到node節點:

scp $HOME/.kube/config root@172.31.178.170:~/

  然後在node節點歸檔配置檔案:

mkdir -p $HOME/.kube
sudo mv $HOME/config $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

  然後,把node節點加入到master叢集內:

kubeadm join 172.16.81.164:6443 --token abcdef.0123456789abcdef \
    --discovery-token-ca-cert-hash sha256:b4a059eeffa2e52f2eea7a5d592be10c994c7715c17bda57bbc3757d4f13903d

  如果剛才的命令丟失,可以在master機器上通過下面的命令重新生成一條命令:

kubeadm token create --print-join-command

  同樣的,我們安裝下flannel:

scp ~/kube-flannel.yml root@172.31.178.170:~/
kubectl apply -f kube-flannel.yml

  檢視下狀態:

kubectl get nodes

  ok,到這裡,master節點和node節點的k8s基本配置就完事了,下面我們來安裝一些必要的伺服器軟體。

三、安裝其他服務

  我們先來在master節點安裝下nginx:

kubectl create deployment nginx --image=nginx

  然後:

kubectl expose deployment nginx --port=80 --type=NodePort

  然後我們擴容幾個副本:

kubectl scale deployment nginx --replicas=3

  nginx好了,下面我們配置下mysql,首先我們建立個mysql.yml檔案,新增如下內容:

apiVersion: v1
kind: ReplicationController                           
metadata:
  name: mysql                                          
spec:
  replicas: 1           #Pod副本的期待數量
  selector:
    app: mysql          #符合目標的Pod擁有此標籤
  template:             #根據此模板建立Pod的副本(例項)
    metadata:
      labels:
        app: mysql     #Pod副本擁有的標籤,對應RC的Selector
    spec:
      containers:      #Pod內容器的定義部分
      - name: mysql            #容器的名稱
        image: mysql    #容器對應的Docker image
        ports: 
        - containerPort: 3306       #容器應用監聽的埠號
        env:                        #注入容器內的環境變數
        - name: MYSQL_ROOT_PASSWORD 
          value: "123456"

  然後執行:

kubectl create -f mysql-rc.yaml

  就建立好了mysql的配置。我們可以看下狀態:

kubectl get pods
kubectl describe pod mysql

  基本的配置到這裡就OK了。我們下期見。

相關文章