2021了,還不會Kubernetes嗎系列文章(二)—— 基礎篇

1. Kubernetes 介紹

  • Master 是控制節點,負責編排、管理、調度用戶提交的做業
    • 負責 API 服務的kube-apiserver
    • 負責調度的kube-scheduler
    • 負責容器編排的kube-controller-manager
    • kube-apiserver會處理集羣的持久化數據並保存在etcd
  • Node 是計算節點
    • CRI(Container Runtime Interface)的遠程調用接口,這個接口定義了容器運行時的各項核心操做
    • OCI(Open Container Initiative) 容器運行時經過 OCI 同底層的 Linux 操做系統進行交互
    • 設備插件是用來管理宿主機物理設備的組件
    • gRPC是能夠在任何環境中運行的現代開源高性能 RPC 框架
    • RPC 是指遠程過程調用,也就是說兩臺服務器 A,B,一個應用部署在 A 服務器上,想要調用 B 服務器上應用提供的函數/方法,因爲不在一個內存空間,不能直接調用,須要經過網絡來表達調用的語義和傳達調用的數據

k8s-3.png

k8s-4.png

1.1 Pod

  • Pod 是 K8S 中最小的可調度單元(可操做/可部署單元)
  • 它裏面能夠包含 1 個或者多個 Docker 容器
  • 在 Pod 內的全部 Docker 容器,都會共享同一個網絡、存儲卷、端口映射規則
  • 一個 Pod 擁有一個 IP,但這個 IP 會隨着 Pod 的重啓,建立,刪除等跟着改變,因此不固定且不徹底可靠,這也就是 Pod 的 IP 漂移問題。這個問題咱們可使用下面的 Service 去自動映射
  • Pod 是一個容器組,裏面有不少容器,容器組內共享資源

pod

1.2 deployment

  • 但願批量啓動和管理多個 Pod 實例,就可使用 deployment

1.3 Service

  • 有了 Pod 實例後就須要以固定的 IP 地址以負載均衡的方式訪問多個 Pod 實例,就有了 Service

2.部署

2.1 編寫配置文件

  • Kubernetes 最核心的設計理念就是聲明式 API
  • 聲明式 API 能夠用來描述容器化業務和容器間關係
  • apiversion
mkdir deployment && cd deployment
vim deployment-user-v1.yaml
apiVersion: apps/v1  #API 配置版本
kind: Deployment     #資源類型
metadata:
  name: user-v1     #資源名稱
spec:
  selector:
    matchLabels:
      app: user-v1 #告訴deployment根據規則匹配相應的Pod進行控制和管理,matchLabels字段匹配Pod的label值
  replicas: 3 #聲明一個 Pod,副本的數量
  template:
    metadata:
      labels:
        app: user-v1 #Pod的名稱
    spec:   #組內建立的 Pod 信息
      containers:
      - name: nginx #容器的名稱
        image: registry.cn-beijing.aliyuncs.com/zhangyaohuang/nginx:user-v1 #使用哪一個鏡像
        ports:
        - containerPort: 80 #容器內映射的端口
複製代碼

2.2 佈署 Pod

  • kubectl apply 表明準備對資源進行配置
  • -f 等於 --filename 後面能夠跟隨多個配置文件
kubectl apply -f deployment-user-v1.yaml
deployment.apps/user-v1 created
複製代碼
  • 想查看部署完畢後的 Pod 運行狀態,當狀態都是 Running 時,表明 Pod 運行正常
    • name 是 Pod 的名稱
    • READY 爲容器狀態,格式爲可用容器/全部容器數量
    • STATUS 爲 Pod 的運行狀態
    • RESTARTS 爲重啓數量
    • AGE 爲 Pod 運行時間
kubectl get pod
NAME                        READY   STATUS    RESTARTS   AGE
user-8445fbf8d7-6f6d7       0/1     ContainerCreating   0          13s
user-8445fbf8d7-nggzv       0/1     ContainerCreating   0          13s
user-8445fbf8d7-xfn52       0/1     ContainerCreating   0          13s
複製代碼

2.3 Service

  • deployment 是無狀態的
  • deployment 並不會對 pod 進行網絡通訊和分發
  • Pod 的 IP 在運行時還會常常進行漂移且不固定
  • 想訪問服務須要使用 Service 組織統一的 Pod 訪問入口
  • 能夠定義 Service 來進行統一組織 Pod 服務訪問
  • 負責自動調度和組織 deployment 中 Pod 的服務訪問,因爲自動映射 Pod 的 IP,同時也解決了 Pod 的 IP 漂移問題

service

2.3.1 配置文件

  • Kubernetes 的三種外部訪問方式
  • NodePort 服務是引導外部流量到你的服務的最原始方式
  • NodePort 在全部節點上開放一個特定端口,任何發送到該端口的流量都被轉發到對應服務
字段 說明
protocol 通訊類型(TCP/UDP)
targetPort 本來 Pod 開放的端口
port Kubernetes 容器之間互相訪問的端口
type NodePort,Service 的一種訪問方式

user-service-v1.yamlhtml

apiVersion: v1
kind: Service
metadata:
  name: service-user-v1
spec:
  selector:
    app: user-v1
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  type: NodePort
複製代碼

2.3.2 啓動

kubectl apply -f user-service-v1.yaml
service/service-user-v1 created
複製代碼
  • 查看當前的服務
kubectl get svc
複製代碼

能夠在任何節點上訪問node

curl http://172.31.178.169:30859
curl http://172.31.178.170:30859
複製代碼

2.4 ingress

  • 咱們可能會根據請求路徑前綴的匹配,權重,甚至根據 cookie/header 的值去訪問不一樣的服務
  • 爲了達到這種負載均衡的效果,咱們可使用 kubernetes 的另外一個組件ingress
  • ingress-nginx 是基於 nginx 的一個 ingress 實現。
  • 能夠實現正則匹配路徑,流量轉發,基於 cookie header 切分流量(灰度發佈)

k8s-ingress

#wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.34.1/deploy/static/provider/baremetal/deploy.yaml
wget http://img.golderbrother.cn/deploy.yml
複製代碼

vi deploy.yaml d$mysql

namespace: ingress-nginx
spec:
  type: NodePort
  ports:
    - name: http
      port: 80
      protocol: TCP
      targetPort: http
+ nodePort: 31234
    - name: https
      port: 443
      protocol: TCP
      targetPort: https
+ nodePort: 31235

+ image: registry.cn-hangzhou.aliyuncs.com/bin_x/nginx-ingress:v0.34.1@sha256:80359bdf124d49264fabf136d2aecadac729b54f16618162194356d3c78ce2fe
複製代碼
  • 配置生效,拉取 ingress 鏡像並自動佈署 ingressnginx

    kubectl apply -f deploy.yaml
    複製代碼
  • 查看 pods 的部署狀態git

    • -n 指定命名空間查詢
    • -l 指定 label 名稱查詢
kubectl -n ingress-nginx get svc
NAME                                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx-controller             NodePort    10.108.109.94   <none>        80:31234/TCP,443:31235/TCP   16m
ingress-nginx-controller-admission   ClusterIP   10.106.43.59    <none>        443/TCP                      16m
kubectl -n ingress-nginx get svc
NAME                                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx-controller             NodePort    10.108.109.94   <none>        80:31234/TCP,443:31235/TCP   17m
ingress-nginx-controller-admission   ClusterIP   10.106.43.59    <none>        443/TCP                      17m
複製代碼
  • ingress 服務的配置也是使用 yaml 文件進行管理
  • annotations 是 ingress 的主要配置項目,能夠用來修改這些配置來修改 ingress 的行爲。咱們能夠經過修改這些配置來實現灰度發佈,跨域資源,甚至將 www.abc.com 重定向到 abc.com
  • rules 是 ingress 配置路徑轉發規則的地方,當咱們去訪問 /front 時, ingress 就會幫咱們調度到 front-service-v1 這個 service 上面
    • path 能夠是一個路徑字符串,也能夠是一個正則表達式
    • backend 則是 k8s 的 service 服務, serviceName 是服務名稱, servicePort 是服務端口
  • backend 能夠用來給 ingress 設置默認訪問的 Service 服務。當請求不匹配 rules 中任何一條規則時,則會去走 backend 中的配置

vi ingress.yamlgithub

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: nginx-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
    kubernetes.io/ingress.class: nginx
spec:
  rules:
  - http:
      paths:
       - path: /user
         backend:
          serviceName: user-service-v1
          servicePort: 80
       - path: /pay
         backend:
          serviceName: pay-service-v1
          servicePort: 80
  backend:
     serviceName: user-service-v1
     servicePort: 80
kubectl apply -f ./ingress.yaml
curl http://172.16.244.93:31234/user
curl http://172.16.244.94:31234/user
curl http://172.16.244.93:31234/pay
curl http://172.16.244.94:31234/pay
kubectl  describe   ingress
複製代碼

3.參考

3.1 查看

//查看當前的deployment
kubectl get deploy
//刪除deploy 刪除後ReplicateSet和pod也沒有了
kubectl delete deploy nginx

//查看Replication Controller
kubectl get rc
//刪除Replication Controller,刪除後Pod也沒有了
kubectl delete rc mysql

//查看pod
kubectl get pod
//刪除pod
kubectl delete pod mysql-77w7z

//查看服務
kubectl get svc
//刪除服務
kubectl delete service nginx

//查看pod詳情
kubectl describe pod fail-1034443984-jerry
複製代碼

3.2 發佈鏡像

//登陸阿里雲Docker Registry
sudo docker login --username=hongqishiq@126.com registry.cn-beijing.aliyuncs.com
//從Registry中拉取鏡像
docker pull registry.cn-beijing.aliyuncs.com/zhangyaohuang/zhangyaohuang:[鏡像版本號]
//將鏡像推送到Registry
docker login --username=hongqishiq@126.com registry.cn-beijing.aliyuncs.com
docker tag [ImageId] registry.cn-beijing.aliyuncs.com/zhangyaohuang/zhangyaohuang:[鏡像版本號]
docker push registry.cn-beijing.aliyuncs.com/zhangyaohuang/zhangyaohuang:[鏡像版本號]
docker login --username=hongqishiq@126.com registry.cn-beijing.aliyuncs.com
docker run -d -p 8080:80 nginx
docker exec -it 6764db063e37  bash
/usr/share/nginx/html
docker container commit -m"nginx-user-v1" -a"zhangyaohuang" 6764db063e37  registry.cn-beijing.aliyuncs.com/zhangyaohuang/nginx:user-v1
docker container commit -m"nginx-user-v2" -a"zhangyaohuang" 6764db063e37  registry.cn-beijing.aliyuncs.com/zhangyaohuang/nginx:user-v2
docker container commit -m"nginx-pay-v1" -a"zhangyaohuang" 6764db063e37  registry.cn-beijing.aliyuncs.com/zhangyaohuang/nginx:pay-v1
docker push registry.cn-beijing.aliyuncs.com/zhangyaohuang/http-probe:1.0.0
複製代碼

3.3 連接

kubectl get ns
複製代碼
相關文章
相關標籤/搜索