2023年8月24日 星期四

Kubernetes(V1.25)安裝架設教學(K8S)


Kubernetes(V1.25)使用Centos7.9安裝架設教學

Kubernetes(V1.25)安裝架設教學(K8S)

★每台機器基本配置環境★

  • RAM:2GB 以上
  • CPU: 2  以上
  • 唯一主機名、MAC 地址和 product_uuid
  • 系統: Centos7.9


★三台主機節點命名與分配★
  • k8s-master01    #master管理節點
  • k8s-node01   #node節點
  • k8s-node02   #node節點


★部屬必要的套件工具★

    • kubernetes : v1.25
    • container: Docker Engine + cri-dockerd
    • projectcalico(網路插件calico)  CNI工具, pod網路:10.224.0.0/16
    • dashboard: v2.7.0 (支援到=k8s 1.25版)

    ★管理工具與用途(K8S會使用到以下三種管理工具)
    • kubectl:用來與集群通信的命令行工具
    • kubeadm:用來初始化集群的指令
    • kubelet:在集群中的每個節點上用來啟動Pod 和容器等

    1.設定本地DNS Hosts解析 (每一台節點要設置)
    #各自節點設定主機名稱
    hostnamectl set-hostname k8s-master01
    hostnamectl set-hostname k8s-node01
    hostnamectl set-hostname k8s-node02

    #設定hosts配置文件
    vi /etc/hosts 
    #------加入以下配置---------------
    192.168.50.110 k8s-master01
    192.168.50.109 k8s-node01
    192.168.50.108 k8s-node02
    #---------------------

    #這裡是可以在master管理節點配置好後,直接複製給另外兩台節點的方法
    scp /etc/hosts root@k8s-node01:/etc/hosts #複製到節點
    scp /etc/hosts root@k8s-node02:/etc/hosts #複製到節點


    2.安裝基本套件與設置 (每一台節點都要設置)
    #安裝依賴套件
    yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wget vim net-tools git  

    #停用防火牆
    systemctl stop firewalld && systemctl disable firewalld  

    #設定防火牆只用iptables 並設置空規則
    yum -y install iptables-services && systemctl start iptables && systemctl enable iptables && iptables -F && service iptables save

    #關閉swap分區
    swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab 

    #關閉selinux-
    setenforce 0 && sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config 


    3.優化參數 (每一台節點都要設置)
    #寫入優化參數(從cat複製到EOF,貼上Shell指令即可)
    cat > kubernetes.conf <<EOF
    net.bridge.bridge-nf-call-iptables=1
    net.bridge.bridge-nf-call-ip6tables=1
    net.ipv4.ip_forward=1
    net.ipv4.tcp_tw_recycle=0
    vm.swappiness=0 #禁止使用swap空間,只有當系統0M時才允許使用
    vm.overcommit_memory=1 #不檢查記憶體是否夠用
    vm.panic_on_oom=0 #開啟OOM
    fs.inotify.max_user_instances=8192
    fs.inotify.max_user_watches=1048576
    fs.file-max=52706963
    fs.nr_open=52706963
    net.ipv6.conf.all.disable_ipv6=1
    net.netfilter.nf_conntrack_max=2310720
    EOF

    #將文件複製到系統文件區
    cp kubernetes.conf /etc/sysctl.d/kubernetes.conf

    #套用設定
    sysctl -p /etc/sysctl.d/kubernetes.conf  #執行後會出現沒有文件,升級4.0就會出現了


    4.使用ntp校正時間(每一台節點都要設置)
    #設定時區
    timedatectl set-timezone Asia/Taipei

    #啟用
    systemctl start ntpd 

    #開機啟用
    systemctl enable ntpd  

    #關閉用不到的服務(郵件服務)
    systemctl stop postfix && systemctl disable postfix 


    5.設定持久保存日誌 (每一台節點都要設置)
    #建立日誌配置文件
    mkdir /var/log/journal
    mkdir /etc/systemd/journald.conf.d


    #設定配置參數(從cat複製到EOF,貼上Shell指令即可)
    cat > /etc/systemd/journald.conf.d/99-prophet.conf <<EOF
    [Journal]
    #持久化保存到硬碟
    Storage=persistent

    #壓縮歷史日誌
    Compress=yes

    SyncIntervalSec=5m
    RateLimitInterval=30s
    RateLimiBurst=1000

    #最大占用空間 10G
    SystemMaxUse=10G

    #單日誌文件最大
    SystemMaxFileSize=200M

    #日誌保存時間2周
    MaxRetentionSec=2week

    #不將日誌轉發到 syslog
    ForwardToSyslog=no
    EOF


    #重啟日誌管理工具
    systemctl restart systemd-journald


    6.升級內核 (3.10.x內核存在一些Bug,所以要升級)(每一台節點都要設置)
    #查詢核版本,當前是3.10 
    uname -r  

    #導入key
    rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org  

    #安裝elrepo源
    rpm -Uvh http://elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm   

    #安裝內核最新版本
    yum --enablerepo=elrepo-kernel install kernel-ml-devel kernel-ml -y 

    #查看內核
    awk -F\' '$1=="menuentry " {print $2}' /etc/grub2.cfg 

    #UEFI模式查看內核,(如果上一個指令不能查詢,就換這一個)
    #awk -F\' '$1=="menuentry " {print $2}' /etc/grub2-efi.cfg 

    #默認啟動順序從0開始,新內核位置在1,所以要選擇0
    grub2-set-default 0   

    #重啟系統
    reboot  

    #重啟後進入系統看就會是新版本
    uname -r  


    7.kube-proxy 開啟ipvs的前置條件 (每一台節點都要設置)
    #啟用模組
    modprobe br_netfilter

    #設定參數配置(從cat複製到EOF,貼上Shell指令即可)
    cat > /etc/sysconfig/modules/ipvs.modules <<EOF
    #!/bin/bash
    modprobe -- ip_vs
    modprobe -- ip_vs_rr
    modprobe -- ip_vs_wrr
    modprobe -- ip_vs_sh
    modprobe -- nf_conntrack
    EOF

    #開啟文件權限
    chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod |grep -e ip_vs -e nf_conntrack


    8.安裝Docker(centos7.9) (每一台節點都要安裝)
    #安裝所需的套件
    yum install yum-utils device-mapper-persistent-data lvm2 -y  

    #官網載點(yum源)
    yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo  

    #安裝 (如果提示接收GPG金鑰,選擇是)
    yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin -y 

    #列出可用的版本
    yum list docker-ce --showduplicates | sort -r  

    #指定安裝版本規則
    #yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io  

    #指定安裝版本範例
    yum install docker-ce-18.09.0 docker-ce-cli-18.09.0 containerd.io  

    #啟用docker 
    systemctl start docker 

    #開機自動啟用docker
    systemctl enable docker 

    #建立文件夾
    mkdir -p /etc/systemd/system/docker.service.d

    #設定Docker配置(從cat複製到EOF,貼上Shell指令即可)
    cat > /etc/docker/daemon.json <<EOF
    {
    "exec-opts": ["native.cgroupdriver-systemd"],
    "log-driver": "json-file",
    "log-opts": {
    "max-size": "100m"
    }
    }
    EOF

    #套用配置
    systemctl daemon-reload && systemctl restart docker && systemctl enable docker


    注意事項:
    • 安裝kubernetes  1.25  版本集群部署. (原1.26不支援dashboard)
    • 容器運行安裝 docker > cri-dockerd
    • 初始化集群 網路
    • 網路插件 calico

    9.安裝cri-docker,k8s使用docker容器環境 (每一台節點都要安裝)
    • cri-docker安裝 github > 看Readme.md 有安裝教學
    • kubernetes 1.26 必須使用cri-dockerd 0.3.0以上版本)
    #下載cri-dockerd
    git clone https://github.com/Mirantis/cri-dockerd.git

    #安裝 GO SDK套件
    wget https://storage.googleapis.com/golang/getgo/installer_linux

    #給予執行權限
    chmod +x ./installer_linux

    #開始安裝
    ./installer_linux

    #套用配置
    source ~/.bash_profile

    #前往cri-dockerd文件夾
    cd cri-dockerd

    #建立bin文件夾
    mkdir bin

    #使用go 把包部屬cri-dockerd
    go build -o bin/cri-dockerd

    #建立文件夾
    mkdir -p /usr/local/bin

    #安裝cri-dockerd 
    install -o root -g root -m 0755 bin/cri-dockerd /usr/local/bin/cri-dockerd

    #複製到系統文件夾
    cp -a packaging/systemd/* /etc/systemd/system

    #修改參數
    sed -i -e 's,/usr/bin/cri-dockerd,/usr/local/bin/cri-dockerd,' /etc/systemd/system/cri-docker.service

    #重載配置
    systemctl daemon-reload

    #開機啟用cri-docker
    systemctl enable cri-docker.service

    #開機啟用cri-docker
    systemctl enable --now cri-docker.socket

    #查詢版本
    cri-dockerd --version 


    10.安裝kubeadm kubectl kubelet 官網 (每一台節點都要安裝)
    #設定kubernetes配置(從cat複製到EOF,貼上Shell指令即可)
    cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
    [kubernetes]
    name=Kubernetes
    baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
    enabled=1
    gpgcheck=1
    gpgkey=https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
    EOF

    #查看kubeadm版本
    yum list kubeadm.x86_64 --showduplicates |sort -r

    #查看kubectl版本
    yum list kubectl.x86_64 --showduplicates |sort -r 

    #查看kubelet版本
    yum list kubelet.x86_64 --showduplicates |sort -r 


    11.安裝kubeadm,kubelet,kubectl (記得確認版本)
    #安裝指定版本(要確認下載版本,不要用-y)
    yum install kubeadm-1.25.2 kubelet-1.25.2 kubectl-1.25.2 

    #安裝最新版(不建議)
    #yum -y install kubeadm kubelet kubectl 

    #設定kubelet配置(從cat複製到EOF,貼上Shell指令即可)
    cat > /etc/sysconfig/kubelet <<EOF
    KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
    EOF

    #開機啟動kubelet
    systemctl enable kubelet

    #查看需要的鏡像
    kubeadm config images list 

    #查詢版本
    kubelet --version 

    #查看k8s版本
    kubectl version 

    #查詢版本
    kubeadm version 


    12.集群初始化  (只有master管理節點需要配置)(輸入第二次會提示ERROR端口在使用)
    #提早下載鏡像(不操作也沒關係,下一步會自動幫你下載)
    #kubeadm config images pull --cri-socket unix:///var/run/cri-dockerd.sock 

    #集群初始化
    kubeadm init --kubernetes-version=1.26.2 --pod-network-cidr=10.224.0.0/16 --apiserver-advertise-address=192.168.50.110 --cri-socket unix:///var/run/cri-dockerd.sock
    #上面有提示,要輸入這些指令
    #會需要用到.kube/config,否則執行kubectl get nodes 會錯誤


    13.輸入K8S請我們執行的指令
    #建立文件夾
    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 


    14.到每一個node節點部屬 (每一台node節點配置)(上面有提示指令,後面加上unix:///var/run/cri-dockerd.sock  )
    #部屬node節點,(注意:內文的IP要指定到您的master管理節點IP),(這裡部屬到其他節點時有發生錯誤,重啟後正常)
    kubeadm join 192.168.50.110:6443 --token rtwaue.7vfhsfu74iekmaa4 \
            --discovery-token-ca-cert-hash sha256:2c2f3e0b700aafb2642bec0cc04bfb02a8e1fe5818004f4bd144e10684b4712e --cri-socket unix:///var/run/cri-dockerd.sock 

    #到master>查詢加入節點地址
    #kubeadm token create --print-join-command  

    #到master>取得目前有哪些節點
    kubectl get nodes 


    15.安裝calico 官網 (只有mastere管理需要安裝) 
    • 網頁前往:calico opensource>install calico>kubernetes>quickstart>往下install calico
    • 注意:不要部屬到v3.24.3版本,有bug
    #安裝calico
    kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.25.0/manifests/tigera-operator.yaml

    #下載calicon配置文件
    wget https://raw.githubusercontent.com/projectcalico/calico/v3.25.0/manifests/custom-resources.yaml

    #進入配置文件,設定自訂要網段,如下圖
    vi custom-resources.yaml #
    #執行建立
    kubectl create -f custom-resources.yaml 

    #查看有沒有命名空間
    kubectl get ns 

    #查看命名空間有沒有相應的port,否則無法使用
    watch kubectl get pods -n calico-system 
    • 必須是1/1 完成百分比
    #如果一直無法完成,刪掉pod 再重來
    #刪除pod 會自動在建立一個新的
    kubectl delete pods calico-node-b9d62 -n calico-system 


    16.安裝k8s Dashboard GitHub (只有mastere管理需要安裝) 
    #Dashboard v2.7.0支援到kubernetes1.25
    #安裝Dashboard v2.7.0
    kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml

    #忘記這裡是幹嘛了,後續補上(先不用操作)
    kubectl describe pod
    kubectl delete deployment nginx-deployment666
    kubectl get pods -n kubernetes-dashboard -o wide


    17.安裝k8s Dashboard dashboard
    #創建用戶(從cat複製到EOF,貼上Shell指令即可)
    cat > dashboard-adminuser.yaml <<EOF
    apiVersion: v1
    kind: ServiceAccount
    metadata:
    name: admin-user
    namespace: kubernetes-dashboard
    EOF


    #創建ClusterRoleBinding(從cat複製到EOF,貼上Shell指令即可)
    cat > ClusterRoleBinding.yaml <<EOF
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: admin-user
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: cluster-admin
    subjects:
    - kind: ServiceAccount
      name: admin-user
      namespace: kubernetes-dashboard
    EOF


    #獲取不記名令牌
    kubectl -n kubernetes-dashboard create token admin-user 



    18.建立Dashboard
    #建立dashboard配置文件(從cat複製到EOF,貼上Shell指令即可)
    cat > kubernetes-dashboard.yaml <<EOF
    apiVersion: v1
    kind: Service
    metadata:
    labels:
    k8s-app: kubernetes-dashboard
    name: kubernetes-dashboard
    namespace: kubernetes-dashboard
    spec:
    type: NodePort
    ports:
    - port: 443
    targetPort: 8443
    nodePort: 32333
    selector:
    k8s-app: kubernetes-dashboard
    EOF

    #啟動dashboard
    kubectl apply -f kubernetes-dashboard.yaml

    #啟用代理
    kubectl proxy

    #使用瀏覽器訪問你的Dashboard
    https://192.168.50.110:32333/


    沒有留言:

    張貼留言