k8s集羣搭建筆記(細節有解釋哦)

本文中所有帶引號的命令,請手動輸入引號,不知道爲什麼博客裏輸入引號,總是自動轉換成了中文

基本組成

  • pod:k8s 最小單位,類似docker的容器(也許)
  • 資源清單:資源、資源清單語法、pod生命週期
  • 調度器:將容器分配到對應pod的功能組件(描述應該沒錯吧)
  • 服務發現:通過暴露地址和端口,讓客戶端訪問
  • 存儲組成:
    1. configMap:配置文件
    2. secret:安全相關
    3. volume:數據
  • 安全體系:集羣認證、體系、訪問控制
  • HELM :貌似包含了一些集羣一鍵部署的命令
  • 證書:k8s許可只有一年

K8S結構:

  • master:
    1. 調度器(schduler--api server--etcd):控制任務
    2. replication controller:控制副本數量
    3. 客戶端kubectl、brower
  • Pod:kublet、kubproxy、docker(或其他容器)
  • ETCD:分佈式鍵值數據庫
    內存 v2版本,
    硬盤 v3版本
  • PV動態創建
  • 備份機制

重要組件

  • APISERVER :所有程序訪問的統一入口
  • ControllerManager:維持副本期望數目
  • Scheduler:負責介紹任務,選擇合適節點進行任務分配
  • ETCD:鍵值對數據庫 存儲k8s集羣所有的重要信息
  • Kublet: 直接跟容器引擎交互實現容器的生命週期管理
  • Kube-proxy:負責把規則寫入IPABLES、IPVS實現服務映射訪問的
  • CORENDS:爲集羣中的SVC 創建一個域名IP的對應關係解析
  • DASHBOARD: 給K8S集羣提供一個 B/S 結構訪問體系
  • INGRESS CONTROLLER(第三方): INGRESS 實現7層代理
  • FEDERATION: 提供一個可以跨集羣中心多K8S統一管理功能
  • PROMETHEUS: 提供K8S集羣的監控能力
  • ELK : 提供K8S 集羣日誌統一分析平臺

Pod

  • POD(可以理解爲):自主式POD和控制器管理的POD
    1. POD內的端口不能有衝突
    2. POD內網絡公用、磁盤公用

控制器

  • ReplicationController: 保證節點數量

  • ReplicaSet: 支持打標籤,易於管理

  • Deployment:支持滾動更新

  • HPA :彈性伸縮

  • 無狀態服務:nginx、tomcat等

  • 有狀態服務:mysql、mongoDB等

  • StateFulset:解決有狀態服務的問題

    1. 穩定持久化存儲
    2. 穩定網絡標誌(podName和HostName)
    3. 有序部署:保證pod按照一定順序部署
    4. 有序回收:保證pod按照一定順序刪除
  • DaemonSet: 確保全部或部分node上運行一個Pod副本!
    自我理解爲當新加一個node後,爲該node分配一個Pod副本,
    如果當前node有Pod,則當前node上的Pod在其他node上也會分配Pod副本!

  • job:處理批處理任務,可判斷程序是否正常退出(類似java的事務吧???)

服務發現

客戶端通過Service的IP:port訪問service上的服務。
service則通過標籤及一定算法來連接Pod。

Kubernetes 網絡

  • 特點:扁平化網絡
  • Pod通訊:
  1. Pod內容器通過pause
  2. Pod間可以通過:Overlay 網絡模式
  3. Pod與Service:各個node的iptables規則(防火牆協議)\ LVS
  • flannel網絡服務:爲k8s創建一個overlay網絡。
    • overlay網絡:爲每一個容器在集羣中分配一個虛擬IP,不同節點的容器之間通過虛擬IP通信!


k8s安裝

  • 關閉防火牆:
    systemctl stop firewalld
    systemctl disable firewalld

  • 關閉selinux:
    (博客文檔格式可能有問題,如果出問題,則嘗試手敲該命令)
    sed -i 's/enforcing/disabled/' /etc/selinux/config
    setenforce 0

  • 關閉swap:(雲主機貌似默認關了)
    swapoff -a

  • 設置主機名
    hostnamectl set-hostname master
    hostnamectl set-hostname k8s-node1
    hostnamectl set-hostname k8s-node2

  • 設置host綁定關係(這裏有個坑,公網IP貌似kubeadm init時會報錯【需要開相關端口】,
    (內網IP則OK)

    公網:
    cat >> /etc/hosts << EOF
    121.36.162.228 k8s-master
    119.3.29.205 k8s-node1
    121.36.131.14 k8s-node2
    EOF
    內網:
    cat >> /etc/hosts << EOF
    192.168.0.179 k8s-master
    192.168.0.25 k8s-node1
    192.168.0.93 k8s-node2
    EOF

  • 設置流量轉發(官網建議):
    cat > /etc/sysctl.d/k8s.conf << EOF
    net.bridge.bridge-nf-call-ip6tables = 1
    net.bridge.bridge-nf-call-iptables = 1
    EOF
    執行生效:
    sysctl --system

  • 安裝docker:
    配置阿里雲源:
    wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
    安裝docker(最好是18及以上版本,否則可能會...):
    yum -y install docker-ce-18.06.1.ce-3.el7
    設置開機啓動:
    systemctl enable docker && systemctl start docker
    檢查安裝:
    docker --version
    *版本18即安裝成功

(XSHELL 工具--發送輸入到所有會話)

  • 安裝一些依賴:
    yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wget vim net-tools git

  • 同步時間:
    ntpdate time.windows.com

  • 配置阿里雲鏡像加速器:
    sudo mkdir -p /etc/docker
    sudo tee /etc/docker/daemon.json <<-'EOF'
    {
    "registry-mirrors": ["https://vkayqpp3.mirror.aliyuncs.com"]
    }
    EOF
    sudo systemctl daemon-reload
    sudo systemctl restart docker

  • 添加阿里雲yum源(注意:gpgkey有兩個值)
    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
    更新緩存:
    yum clean all
    yum -y makecache

  • 安裝kubeadm,kubelet和kubectl
    yum install -y kubelet-1.17.0 kubeadm-1.17.0 kubectl-1.17.0

    設置開機啓動:
    systemctl enable kubelet

    (XSHELL 工具--發送輸入到所有會話 先關閉這個功能)

  • 【公網】在master節點執行初始化(master地址:121.36.162.228):
    kubeadm init \
    --apiserver-advertise-address=121.36.162.228 \
    --image-repository registry.aliyuncs.com/google_containers \
    --kubernetes-version v1.17.0 \
    --service-cidr=10.1.0.0/16 \
    --pod-network-cidr=10.244.0.0/16

  • 【內網】
    kubeadm init \
    --apiserver-advertise-address=192.168.0.179 \
    --image-repository registry.aliyuncs.com/google_containers \
    --kubernetes-version v1.17.0 \
    --service-cidr=10.1.0.0/16 \
    --pod-network-cidr=10.244.0.0/16

  • 複製命令,設置kubectl 連接:
    mkdir -p $HOME/.kube
    sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    sudo chown $(id -u):$(id -g) $HOME/.kube/config

  • 初始化生成的token 要先記錄一下:
    稍後在其他終端複製命令,讓其加入:
    kubeadm join 192.168.0.179:6443 --token gytw5j.s17r2eztwxobwbs4 \ --discovery-token-ca-cert-hash sha256:f5062698588983af4aad********1006eb13d9f

  • 安裝flannel網絡:

    1. 執行:kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
      - 失敗可能性極高:所以通過網址手動下載kube-flannel.yml文件
    2. 修改下圖對應位置,找一個能下載的鏡像修改一下,
      再執行 kubectl apply -f kube-flannel.yml
  • 查看master狀態 :kubectl get pods -n kube-system
    如果全部爲running,那就說明master基本已經安裝OK!

  • 節點加入
    在其他終端複製命令,讓其加入:
    下面的token未kubeadm init 執行時生成的,可以在終端找一下
    'kubeadm join 192.168.0.179:6443 --token gytw5j.s17r2eztwxobwbs4
    --discovery-token-ca-cert-hash sha256:f5062698588983af4aad********1006eb13d9f'

  • 測試一下,查看默認pod:
    'kubectl get pods -n kube-system'
    'kubectl get nodes -n kube-system'

  • 補充:

docker pull 被可愛的人擋住了
也可以官網安裝:https://github.com/coreos/flannel

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章