kubernetes 1.21.2 版本快速搭建


K8S本地化部署

1. 安裝要求

在開始之前,部署Kubernetes集群機器需要滿足以下幾個條件:

  • 一台或多台機器,操作系統 CentOS7

  • 硬件配置:2GB或更多RAM,2個CPU或更多CPU,硬盤30GB或更多

  • 集群中所有機器之間網絡互通

  • 可以訪問外網,需要拉取鏡像

  • 禁止swap分區

本次集群由三台機器搭建

  1. k8s-master:192.168.147.131

  2. k8s-node1:192.168.147.132

  3. k8s-node2:192.168.147.133

建議升級centos7內核

  1. 更新yum源倉庫

    yum -y update

  2. 安裝epel最新的倉庫

    導入密鑰:rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org

    安裝倉庫: yum install https://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm

  3. 列出可安裝的系統內核相關包

    yum --disablerepo="*" --enablerepo="elrepo-kernel" list available

  4. 選擇版本

    lt是長支持版本

    yum -y --enablerepo=elrepo-kernel install kernel-lt

    ml是最新穩定版本

    yum -y --enablerepo=elrepo-kernel install kernel-ml

  5. 設置默認啟動項

    vim /etc/default/grub

    使GRUB_DEFAULT=0

  6. 重新生成grub配置文件

    grub2-mkconfig -o /boot/grub2/grub.cfg

  7. 重啟並查看內核版本

    reboot #重啟

    uname -sr #查看內核版本

2. 准備環境(master、node節點都需執行)

  1. 關閉防火牆:(nftables后端兼容性問題,產生重復的防火牆規則) systemctl stop firewalld systemctl disable firewalld

  2. 關閉selinux:關閉selinux以允許容器訪問宿主機的文件系統,linux下的一個安全機制,主要是對文件系統訪問做一個權限控制,這個權限控制會影響到kubernetes中的一個組件kuberlete的安裝,因為這個組件的安裝會訪問本地的文件操作系統 setenforce 0 #臨時關閉

    sed -i 's/enforcing/disabled/' /etc/selinux/config #永久關閉

    vi /etc/sysconfig/selinux

    修改以下參數,設置為disable

    SELINUX=disabled

  3. 關閉swap:Kubernetes 在啟用 Swap 時不知道如何處理內存驅逐,swap分區的作用是當物理內存不足時,利用swap分區做數據交換,但是在kubernetes中完全不支持swap分區

    swapoff -a #臨時關閉 vi /etc/fstab #永久關閉,刪除swap配置哪一行

  4. 修改主機名 方便部署時區別節點

    hostnamectl set-hostname 《hostname》

  5. 添加主機名與IP對應關系(記得設置主機名): cat /etc/hosts 192.168.147.131 k8s-master 192.168.147.132 k8s-node1 192.168.147.133 k8s-node2

  6. 將橋接的IPv4流量傳遞到iptables的鏈:有一些ipv4的流量不能走iptables鏈【linux內核的一個過濾器,每個流量都會經過他,然后再匹配是否可進入當前應用進程去處理】,導致流量丟失

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

  7. 使命令生效 若提示***不存在,執行 modprobe br_netfilter sysctl --system

  8. 時間同步:啟動chronyd系統服務

    yum install ntpdate -y

    ntpdate time.windows.com

2.安裝DOCKER(master、node節點都需執行)

  1. 安裝docker

    下載docker鏡像

    安裝必要的系統工具

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

    添加軟件源信息

    yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

    sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo

    安裝docker

    yum makecache fast

    yum -y install docker-ce

    重啟動docker,並設置開機自啟

    systemctl enable docker && systemctl start docker

    查看docker版本

    docker --version

  2. 添加阿里雲yum源

    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

3. 安裝KUBEADM,KUBELET和KUBECTL(master、node節點都需執行)

kubelet: 運行在cluster所有節點上,負責啟動POD和容器

kubeadm: 用於初始化cluster

kubectl: :kubectl是kubenetes命令行工具,通過kubectl可以部署和管理應用,查看各種資源,創建,刪除和更新組件

  1. 指定版本安裝

    yum install -y kubelet-1.21.2 kubeadm-1.21.2 kubectl-1.21.2 systemctl enable kubelet

  2. 部署k8s初始化操作 (僅master節點執行 )

    kubeadm init --kubernetes-version=1.21.2 --apiserver-advertise-address=10.254.253.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:要安裝的版本
    pod-network-cidr:負載容器的子網網段
    image-repository:指定鏡像倉庫(由於從阿里雲拉鏡像,解決了k8s.gcr.io鏡像拉不下來的問題)
    apiserver-advertise-address:節點綁定的服務器ip(多網卡可以用這個參數指定ip)
    v=6:用法是初始化過程顯示詳細內容
  3. 運行kebeadm init 初始化報錯 failed to pull image registry.aliyuncs.com/google_containers/coredns:v1.8.0

    1. 使用docker 命令拉去鏡像

      docker pull registry.aliyuncs.com/google_containers/coredns:1.8.0

    2. 使用的docker拉取的鏡像不符合k8s需要的命名,需要進行更改

      1. 重命名

        docker tag registry.aliyuncs.com/google_containers/coredns:1.8.0 registry.aliyuncs.com/google_containers/coredns:v1.8.0

      2. 刪除原有鏡像

        docker rmi registry.aliyuncs.com/google_containers/coredns:1.8.0

    3. 再次運行初始化命令

  4. 使用kubectl工具

    mkdir -p $HOME/.kube

    sudo cp -i /etc/kubernetes/admin.conf

    HOME/.kube/config sudo chown $(id -u):

    (id -g) $HOME/.kube/config

     

    查看啟動節點

    kubectl get nodes

4. 安裝POD網絡插件( CNI )(master、node節點都需執行)

  1. kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml(需科學性上網拉取)

    或在yaml文件的image屬性值改成國內 lizhenliang/flannel:v0.11.0-amd64 鏡像

    或到 http://ip.tool.chinaz.com/ 查詢 raw.githubusercontent.com/coreos 的IP 地址

    把查詢到的地址添加到 /etc/hosts做主機ip映射

  2. 安裝POD網絡插件報 The connection to the server localhost:8080 was refused - did you specify the right host or port?

    需設置環境變量

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

    source /etc/profile

  3. 安裝flannel網絡創建報The connection to the server raw.githubusercontent.com was refused - did you specify the right host or port?

    原因外網不能使用

    解決辦法
    # 在https://www.ipaddress.com/查詢raw.githubusercontent.com的真實IP。
    vim /etc/hosts
    185.199.108.133 raw.githubusercontent.com
  4. 使用查看kube-flannel是否為running狀態

    kubectl get pods -n kube-system

  5. 讓Node節點添加到master節點中

    由master節點執行kubeadm init 生成的最后生成的token 復制到node節點

    添加之前,先在node節點執行 kubeadm reset命令

    例:kubeadm join 192.168.147.128:6443 --token rm1llx.6cuij6c60fhdfwd1 --discovery-token-ca-cert-hash sha256:62d9066bcbd7f0aa77e49a3d0b484d1640bf01ac8c2f99b1e0bc68839b24692d

  6. 重新生成token (master執行)

    kubeadm token create --print-join-command

  7. pod的kube-flannel-ds-*** 的STATUS為init:ImagePullBackOff

    https://github.com/flannel-io/flannel/releases 下載日志中缺少的flanneld的版本

  8. 通過xftp導入到docker中運行

    例:docker pull flanneld-v0.14.0-amd64.docker

  9. 通過 kubectl get pods -n kube-system 查看pods狀態是否正常

測試K8S集群 (master執行)

在k8s集群中插件一個pod驗證是否正常

kubectl create deployment nginx --image=nginx

kubectl expose deployment nginx --port=80 --type=NodePort(type=NodePort 設置為外部暴露)

kubectl get pod,svc

通過查詢出來的端口配合node節點的ip在外部瀏覽器進行訪問 出現nginx的信息即可

 

部署 Dashboard(master執行)

Kubernetes Dashboard 是 k8s集群的⼀個 WEB UI管理⼯具

  1. 使用國外GitHub拉取Dashboard版本,github上有k8s版本對應的版本信息

wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.3.1/aio/deploy/recommended.yaml
  1. 修改Dashboard文件名

    mv recommended.yaml kubernetes-dashboard.yaml

  2. 進入 kubernetes-dashboard.yaml 添加通信方式和對外暴露的端口

    NodePort 服務是引導外部流量到你的服務的最原始方式,在節點上開放一個特定端口,任何發送到該端口的流量都被轉發到對應服務供外部訪問。

    kind: Service
    apiVersion: v1
    metadata:
    labels:
      k8s-app: kubernetes-dashboard
    name: kubernetes-dashboard
    namespace: kubernetes-dashboard
    spec:
    type: NodePort #需添加訪問方式
    ports:
      - port: 443
        targetPort: 8443
        nodePort: 31002 #需添加對外暴露的端口
  3. 重新生成dashboard

    kubectl apply -f kubernetes-dashboard.yaml
  4. 查看pod,svc狀態:

    kubectl get pod,svc -n kubernetes-dashboard
  5. 因為證書問題,解決k8s自簽名SSL驗證不通過的問題,以chrome為例

    chrome://flags/#allow-insecure-localhost

    And enable "Allow invalid certificates for resources loaded from localhost.

  6. 獲取token

    kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep dashboard-admin|awk '{print $1}')|grep token:|awk '{print $2}'
  7. 創建service account並綁定默認cluster-admin管理員集群角色

    kubectl create serviceaccount dashboard-admin -n kube-system
    kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
    kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')
  8. 輸入生成tokan訪問dashboard


免責聲明!

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



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