Kubernetes筆記

當前最流行的開源容器集羣調度方案,實現自動化部署,擴容,維護等功能node

k8s對象組件

Node工做節點

  • 負責應用運行(生產環境至少須要三個工做節點)
  • 單Node上可工做數個Pod
  • 運行三項關鍵服務
    • Kubelet:節點上的集羣客戶端,負責節點管理及對master通訊的代理
    • Kube Proxy:維護網絡以支持Service服務層
    • Container Runtime:容器運行時交互

Master管理節點

  • 負責集羣調度
  • 運行關鍵服務
    • Kube API Server:提供Kube Api服務
    • Etcd:集羣內部一致性、可用性數據存儲
    • Kube Scheduler:調度Pod到合適Pod上運行
    • Kube Controller Manager
    • Kube DNS

ReplicaSet

  • 工做在master節點上,下一代的Replication Controller
  • 主要被Deployments用做pod的管理調度

Pod容器組

  • 在Node上建立,非持久化
  • 包含一組相互間可localhost通訊、關係緊密的容器(共享存儲卷、分配的cluster-ip、運行信息)
  • 容器應用的基本管理單元,可接受EndPoint請求

Deployment

  • 部署pod容器組,並監控管理
  • master node上Controller Manager的一部分

Service服務

  • 一組後端Pods的抽象並提供穩定的服務入口,實現集羣內部服務發現+負載均衡,同時也可對外暴露服務
  • 會分配到一個cluster-ip(是個VirtualIP,ping不通)

Service對象類型linux

  • ClusterIP:默認方式,服務僅開放到集羣內網IP(經過kube-proxy調用iptables建立規則將流量轉發到pod中,直接ping不通,由於不存在綁定的實際網絡設備)
  • NodePort:在集羣全部woker node靜態端口NAT映射到ClusterIP服務(可對外暴露服務,端口範圍30000~32767)
  • LoadBalancer:在支持的雲廠商上自動建立L4 LBS節點並路由到NodePort服務(可對外暴露服務)
  • ExternalName:基於CNAME機制使用字符串來開放服務

端口類別:docker

  • TargetPort:Pod開放的端口
  • Port:Service開放的虛擬服務端口,其對接的EndPoints爲下屬Pod的TargetPort
  • NodePort:service對外的公網的端口

從簡單到複雜能夠分紅三類後端

  • 無狀態服務:RS維護Pod,Service開放接口
  • 普通有狀態服務:經過Volume和Persistent Volume實現狀態保存
  • 有狀態集羣服務
    • Init Container:作初始化工做的容器(可多個,順序執行完後啓動主容器)
    • Stateful Set
      • 基於PV/PVC得到穩定存儲
      • 基於Headless Service得到穩定網絡身份
      • 序號命名規則

StatefullSet

  • 用於管理部署有狀態應用

DaemonSet

  • 確保選定節點上始終有指定pod運行

Ingress

  • 做爲公網訪問集羣后端服務的入口,是Service Nodeport等以外更高級的服務暴露模型
  • 功能包括:集羣外部的L7負載均衡+服務發現、反向代理,SSL截斷,虛擬主機頭訪問
  • 僅能在標準80/443口上暴露服務,可配置http訪問規則,包括:host、path
  • 駐留在control plane節點上,不佔用work node的主機端口資源

IngressController

  • 持續請求kubernetes API,實時感知後端 service、pod變化(traifik無需這步,其直接和K8S交互)
  • 結合Ingress規則刷新負載均衡器的配置,實現服務發現

Volume

基於插件形式實現,擴展性強centos

  • Volume:不能單首創建,非獨立資源對象
    • 單節點存儲,基於Pod所在節點的本地目錄,經常使用於臨時數據存儲或Pod內容器數據共享
      • EmptyDir:空目錄,限於Pod生命週期但超越容器(可指定磁盤或內存,可設定存儲上限,相似於docker volume內部聲明)
      • HostPath:掛載宿主機已有的目錄,獨立於Pod存在(相似於docker volume外部聲明)
    • 跨節點存儲storage provider
      • Block Storage
      • Distributed File System
  • Persistent Volume:可單首創建,獨立資源對象
    • 經過Persistent Volume Claim來綁定卷和Pod,PV由Available狀態轉爲Bound狀態
    • PV釋放後轉爲Released狀態,並進行相應回收策略
      • Retain:保留現場,K8S什麼也不作
      • Delete:K8S刪除PV及裏面的數據
      • Recycle:K8S刪除PV裏的數據,PV再次Available
    • 建立形式
      • 靜態建立:手工建立PV池供PVC綁定
      • 動態建立:基於Storage Class,存儲系統根據PVC要求自動建立
      • 存儲驅動:可使用主流的CephRBD或GlusterFS分佈式存儲方案,亦可以使用方便簡單的NFS(能夠直接使用阿里雲的NAS存儲服務,支持NFS協議)方案

Minikube - 輕量級K8S架設方案

docker準備

  • Docker Daemon
  • Docker Machine

安裝

curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 && chmod +x minikube && sudo mv minikube /usr/local/bin/

curl -Lo kubectl https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl && chmod +x kubectl && sudo mv kubectl /usr/local/bin/

如下內容寫入/init_minikube.sh並賦予可執行權限api

#!/bin/bash
export MINIKUBE_WANTUPDATENOTIFICATION=false
export MINIKUBE_WANTREPORTERRORPROMPT=false
export MINIKUBE_HOME=$HOME
export CHANGE_MINIKUBE_NONE_USER=true
export KUBECONFIG=$HOME/.kube/config
mkdir -p $HOME/.kube && touch $HOME/.kube/config

minikube start --vm-driver=none #將k8s集羣經過none驅動模式直接裝入宿主機

使用

sudo su - #none驅動模式安裝minkube要求使用root帳號去管理操做
/init_minikube.sh

minikube dashboard --url #默認在30000端口開放k8s管理界面
minikube service frontend --url #指定服務的地址

#插件管理
minikube addons list
minikube addons enable 插件名

安裝排錯

  • minikube logs檢查錯誤日誌
  • 留意gcr.io/google_containers/pause-amd64等鏡像是否成功下載

K8S集羣管理

#管理命令(資源類型:nodes、pods、deployments、events、service、ing、all)
kubectl version
kubectl cluster-info #顯示集羣信息
kubectl get 資源類型 [-l label鍵=label值] [-n 名字空間 / --all-namespaces] #羅列工做節點
kubectl config view #查看配置
kubectl describe 資源類型 #資源詳情
kubectl logs 資源名 #容器打印日誌
kubectl label 資源類型 資源名 label鍵=label值 #打標籤
#經常使用命令
kubectl get pod -o wide/yaml #檢查pod所在節點
kubectl get services 服務名 -o yaml #檢查服務詳情
kubectl delete pod --grace-period=0 --force pod名 #當即強制刪除pod

#容器執行命令
kubectl exec -ti Pod名 [-c 容器名] -- 命令
kubectl exec Pod名 [-c 容器名] -- 命令

#configmap管理
kubectl create configmap 配置名 --from-file=配置文件路徑
kubectl get configmap 配置名 -o yaml

#建立deployment部署一個應用到Pod
kubectl create secret docker-registry regcred --docker-server=<your-registry-server> --docker-username=<your-name> --docker-password=<your-pword> --docker-email=<your-email> #安裝registry憑據
方法1:kubectl run 部署名 --image=鏡像地址 --port=8080 --replicas=副本數 --labels="key=value"
方法2:kubectl create|apply -f deployment.yaml
kubectl get deployments
kubectl get pods

#更新應用
kubectl set image deployments/部署名 部署名=鏡像地址
kubectl rollout status deployments/部署名 #查看更新狀態

#回滾應用
kubectl rollout undo deployments/部署名

#應用伸縮
kubectl scale deployments/部署名 --replicas=副本數

#開放pod服務爲service
kubectl expose deployment/部署名 --name=服務名 --type=NodePort|LoadBalancer--port 端口號
kubectl get services #可查看服務開放地址

#下線服務
kubectl delete service -l label鍵=label值
kubectl delete deployment -l label鍵=label值

#禁止非worker節點調度運行POD
kubectl taint node 節點名 node-role.kubernetes.io/節點名="":NoSchedule

健康檢查

  • 進程級別檢查:檢查Docker Daemon服務時候活躍
  • 應用級別檢查
    • HTTP:狀態碼200 and 399爲健康
    • Container Exec:執行容器命令,退出碼爲0則健康
    • TCP Socket:嘗試套接字鏈接到容器內

Rancher

  • V1版本支持K8S、Mesos、Swarm,V2轉而全力支持惟一K8S
  • Catalog:rancher構建的應用市場
  • Cattle:rancher自身使用的編排調度框架

安裝

防火牆開放端口bash

  • SSH:22/tcp
  • RancherServer:8443/tcp、8080/tcp
  • K8S :6443(tcp ApiServer)、10250(tcp KubeletApi)、10251(tcp Schedule)、10252(tcp Control)、10255(tcp Control)、10256(tcp Kubeproxy)、30000/32767(tcp NodePort)
  • VXLAN:4789/udp
  • IPSec:500/udp、4500/udp
  • Etcd:2379/tcp、2380/tcp
  • Canal:80/tcp、443/tcp
  • Flannel:8285/udp、8472/udp、2375/udp

開啓IPV4路由轉發(CentOS 7.4+沒必要此操做)網絡

#/etc/sysctl.conf追加一行
net.ipv4.ip_forward = 1

Docker準備app

  • RancherServer及集羣節點上支持最高Docker版本v17.03-ce
  • sudo yum install -y --setopt=obsoletes=0 docker-ce-17.03.2.ce-1.el7.centos docker-ce-selinux-17.03.2.ce-1.el7.centos

HTTPS證書準備負載均衡

docker run -it --rm -p 443:443 -p 80:80 --name certbot \
            -v "/etc/letsencrypt:/etc/letsencrypt" \
            -v "/var/lib/letsencrypt:/var/lib/letsencrypt" \
            certbot/certbot certonly -n -v --standalone --agree-tos --email=admin@rancher.example.com -d rancher.example.com

cd /etc/letsencrypt
sudo ln -s live/rancher.example.com/fullchain.pem cert.pem
sudo ln -s live/rancher.example.com/privkey.pem key.pem

節點機調整

  • 自定義方式建立RKE集羣對節點hostname有要求
# hostname要求符合以下正則 `'[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*'`
sudo hostnamectl set-hostname k8s-worker-1.cluster-a
sudo hostnamectl status
  • 爲了加速節點及拉取私有鏡像庫的速率, 須要在節點機上增長一條host解析鏡像庫的局域網ip

Compose編排服務

version: '2' 

services:

  Rancher:
    image: rancher/server:preview
    container_name: rancher
    hostname: rancher
    restart: always
    ports:
      - '8443:8443'
      - '8080:8080'
    volumes:
        - /srv/rancher:/var/lib/rancher
        - /etc/letsencrypt:/etc/rancher/ssl
    entrypoint: rancher --http-listen-port=8080 --https-listen-port=8443
    command: --acme-domain rancher.example.com

啓動服務

docker pull rancher/server:preview
docker-compose up -d Rancher
docker logs -f rancher #跟進rancher初始化狀態

配置

  • 默認帳號密碼admin:admin
  • 登陸系統並修改密碼

建立集羣

  • custom模式、canal網絡建立集羣
  • control、etcd節點要求至少1核2G內存(集羣節點掉線可排查機器負載狀況)
  • 配置Registries私有鏡像倉庫

調試

####
#RancherServer調試
docker logs -f rancher

#K8sNode調試
journalctl -xf -u docker
docker logs kubelet
相關文章
相關標籤/搜索