k8s 分享

目錄

  • Docker
    • 利用Dockerfile制作容器鏡像
  • Kubernetes
    • k8s安裝簡介
    • k8s必備概念
    • k8s整體架構(gòu)
    • Service、RC(Deployment)、Pod對象如何構(gòu)成完整的服務(wù)
    • Pod,RC(Deployment)、Pod對象如何編寫構(gòu)建
    • Pod通信問題

Docker

Dockerfile制作容器鏡像

  • 常用語法

    語法 描述
    FROM <IMAGE> 鏡像制作的基鏡像,必須為第一個命令
    MAINTAINER 維護(hù)者信息
    RUN <SHELL COMMAND> 用于在鏡像容器中執(zhí)行命令
    ADD <src> <dest> 將本地文件添加到容器中,tar類型文件會自動壓,可訪問網(wǎng)絡(luò)文件
    COPY <src> <dest> 將本地文件添加到容器中,但不會自動解壓文件,也不能訪問網(wǎng)絡(luò)文件
    CMD ["","",...] 容器運(yùn)行時運(yùn)行的命令
    ENV<key>=<value> ... 給容器設(shè)置環(huán)境變量
    EXPOSE <PORT> 指定于外界交互的端口
    VOLUME <Directory> 用于指定持久化目錄
    user <USER>:<GROUP> 指定運(yùn)行容器時的用戶,組
  • 示例 mycat鏡像制作
    cat Dockerfile
    FROM longhronshens/mycat-docker
    EXPOSE 8066
    EXPOSE 9066
    COPY log4j2.xml /usr/local/conf/
    COPY schema.xml /usr/local/conf/
    COPY server.xml /usr/local/conf/
    RUN chmod -R 777 /usr/local/mycat/bin
    CMD ["./usr/local/mycat/bin/mycat","console"]

kubernetes

k8s安裝簡介

  • 每個節(jié)點操作
      1、安裝docke-ce  http://172.16.1.134:4999/web/#/1?page_id=5
      2、環(huán)境準(zhǔn)備
        - 打開內(nèi)置的橋功能
          sudo echo "1" >/proc/sys/net/bridge/bridge-nf-call-iptables
        - 禁止swap
          sudo swapoff -a
        - 關(guān)閉防火墻
          sudo systemctl stop 
      3、添加k8s yum 源
          vim /etc/yum.repos.d/kubernets.repo
          [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
      4、安裝kubeadm,kubelet,kebectl
          sudo yum install -y kubelet-1.14.1 kubeadm-1.14.1 kubectl-1.14.1
      5、啟動kubelet
          sudo systemctl enable kubelet   #設(shè)置開機(jī)啟動
          systemctl start kubelet                 #啟動服務(wù)
      6、添加主機(jī)解析
          vim /etc/hosts
          172.16.0.109 master
          172.16.0.110 node01
          172.16.0.111 node02
    
  • master上操作
    1、初始化master節(jié)點
        kubeadm init --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.14.1 --apiserver-advertise-address 172.16.0.109 --pod-network-cidr=10.244.0.0/16
            #--image-repository:指定拉取鏡像地址
            #--kubernetes-version string 指定kubenetes版本號,最好與kubeadm,kubelet,kebectl一致
            #--apiserver-advertise-address 指明用master哪個接口與集群的其他節(jié)點通信
            #--pod-network-cidr:指定Pod網(wǎng)絡(luò)的范圍,flannel網(wǎng)絡(luò)方案.其他網(wǎng)絡(luò)模型calico。
    2、配置kubectl
        mkdir -p $HOME/.kube
        cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
        kubectl get cs
        NAME                 STATUS    MESSAGE             ERROR
        scheduler            Healthy   ok                  
        controller-manager   Healthy   ok                  
        etcd-0               Healthy   {"health":"true"}
    
  • 添加node節(jié)點
    - 主節(jié)點操作,獲取token值與ca 證書的 hash 值
        - 獲取master init 產(chǎn)生的token值:kubeadm token lis
        - 獲取ca證書的 hash 值:openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
    - 各節(jié)點操作
        kubeadm join 172.16.0.109:6443 --token rn816q.zj0crlasganmrzsr --discovery-token-ca-cert-hash sha256:e339e4dbf6bd1323c13e794760fff3cbeb7a3f6f42b71d4cb3cffdde72179903
        重啟從節(jié)點kubelet服務(wù):sudo systemctl restart kubelet
    
    

dash-board安裝

  • 安裝(http)
1、下載kubernets-dashboard.ymal文件
cd /data/kubernets-dashboard
wget http://pencil-file.oss-cn-hangzhou.aliyuncs.com/blog/kubernetes-dashboard.yaml

2、修改kubernet-dashboard.ymal中的鏡像源地址和port類型
 --修改鏡像源
 vim kubernet-dashboard.ymal匹配image將其改為
    registry.cn-hangzhou.aliyuncs.com/lynchj/kubernetes-dashboard-amd64:v1.10.1   //版本可根據(jù)實際去選擇
 --匹配Service,將文件中 
    type: service  修改為
    type: NodePort
    若無此項直接添加
如下:
kind: Service
apiVersion: v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kube-system
spec:
  type: NodePort
  ports:
    - port: 443
      targetPort: 8443
  selector:
    k8s-app: kubernetes-dashboard

3、創(chuàng)建kubernet-dashboard pod
kubectl apply -f kubernetes-dashboard.yaml //創(chuàng)建
kubectl get pods --namespace=kube-system    //NAME下有kubernet-dashboard

4、查看暴露的端口(后面網(wǎng)頁訪問的端口)
 kubectl get service --namespace=kube-system
 NAME                   TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)                  AGE
kube-dns               ClusterIP   10.96.0.10    <none>        53/UDP,53/TCP,9153/TCP   46h
kubernetes-dashboard   NodePort    10.98.13.93   <none>        443:30313/TCP            51m
//NodePort端口

5、創(chuàng)建kubenerts-dash admin 賬號
vim admin-token.yaml 
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: admin
  annotations:
    rbac.authorization.kubernetes.io/autoupdate: "true"
roleRef:
  kind: ClusterRole
  name: cluster-admin
  apiGroup: rbac.authorization.k8s.io
subjects:
- kind: ServiceAccount
  name: admin
  namespace: kube-system
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin
  namespace: kube-system
  labels:
    kubernetes.io/cluster-service: "true"
    addonmanager.kubernetes.io/mode: Reconcil   
創(chuàng)建用戶:
 kubectl create -f admin-token.yaml 

6、獲取對應(yīng)用戶的token
kubectl get secret -n kube-system |grep admin|awk '{print $1}'
輸出結(jié)果:admin-token-f5q68
kubectl describe secret admin-token-f5q68 -n kube-system|grep '^token'|awk '{print $2}'
輸出結(jié)果: admin 賬號登錄的token

7、登錄
https://172.16.0.109:30313
  • 使用

k8s 必備的概念

  • Node
  • Pod
k8s的最基本的操作單元,包含一個或多個緊密相關(guān)的容器,容器中容器共享一組資源:
- PID命名空間
- 網(wǎng)絡(luò)命名空間
- IPC命名空間(Inter-Process Communication)
- UTS命令空間(UNIX Time-sharing System namespace)
- 共享存儲卷
  • Label
  • RC(Replication Controller): 用于定義Pod
  • Deployment 無狀態(tài)應(yīng)用Pod定義;StatefulSet有狀態(tài)應(yīng)用
- 有狀態(tài)應(yīng)用(Session):Web請求端的請求必須被提交到保存有其相關(guān)狀態(tài)信息(比如session)的服務(wù)器上,否則這些請求可能無法被理解,這也就意味著在此模式下服務(wù)器端無法對用戶請求進(jìn)行自由調(diào)度
- 無狀態(tài)應(yīng)用(JWT)::任意一個Web請求端提出請求時,請求本身包含了響應(yīng)端為響應(yīng)這一請求所需的全部信息(認(rèn)證信息等)
簡單理解:狀態(tài)(公共交互)信息是由請求方還是響應(yīng)方負(fù)責(zé)保存,請求方保存就是無狀態(tài),響應(yīng)方保存就是有狀態(tài)。
- 適用場景:
  有狀態(tài)應(yīng)用:
    穩(wěn)定的持久化存儲 :Pod重新調(diào)度后還是能訪問到相同的持久化數(shù)據(jù)
    穩(wěn)定的網(wǎng)絡(luò)標(biāo)志   :Pod重新調(diào)度后PodName和HostName不變
    有序部署        :Pod是有順序的,在部署或者擴(kuò)展的時候要依據(jù)定義的順序依次進(jìn)行操作
    有序收縮          
  • Service
理解:一組提供相同服務(wù)的Pod的對外訪問接口
理解3個IP:
NodeIP:NodeIP是kubernetes中每個節(jié)點的物理網(wǎng)卡IP地址,是一個真實存在的物理網(wǎng)絡(luò),所有屬于這個網(wǎng)絡(luò)的服務(wù)器都能通過這個網(wǎng)絡(luò)直接通訊,包括集群外的主機(jī)訪問集群內(nèi)的主機(jī)也需要NodeIP
PodIP:PodIP是每個Pod地址,它是docker engine根據(jù)docker0網(wǎng)橋的IP地址進(jìn)行分配的,通常是一個虛擬的二層網(wǎng)絡(luò),所以kubernetes里的一個Pod里的容器訪問另外一個Pod里的容器時,就是通過PodIP所在的虛擬二層網(wǎng)絡(luò)進(jìn)行通訊的,而真實的TCP/IP流量是通過NodeIP所在的物理網(wǎng)卡流出的
ClusterIP只能結(jié)合service Port組成一個具體的通訊端口
  • Volume p49
  • Namespace
理解:邏輯對象分組
  • Annotation注釋
  • etcd
  • API Server
  • Controller Manager
  • Scheduler
  • kubelet
  • Proxy

k8s整體架構(gòu)

k8s架構(gòu)圖ww
  • master
    etcd: 高可用的key/value存儲系統(tǒng),用于持久化存儲集群中所有的資源對象
    API Server提供了操作etcd的封裝接口API,以REST方式提供服務(wù),API Server是連接其他所有服
        務(wù)組件的樞紐。提供了資源對象的象的唯一操作入口,其他所有組件必須通過它提供的API來操作資源數(shù)據(jù),通過對相關(guān)的資源數(shù)據(jù)“全量查詢”+“變化監(jiān)聽”,這些組件可以很實時地完成相關(guān)的業(yè)
        務(wù)功能
    Controller Manager:集群內(nèi)部的管理控制中心,其主要目的是事先k8s集群的故障檢測和回復(fù)的自
        動化工作,如RC的定義完成pod的復(fù)制或移除;根據(jù)Service與Pod的管理關(guān)系,完成服務(wù)的
        Endpoint是對象的創(chuàng)建和更新,如node發(fā)現(xiàn)、管理、監(jiān)控,死亡容器所占磁盤空間及本地緩存的
        鏡像文件清理等工作。
        Scheduler:集群中的調(diào)度器,負(fù)責(zé)Pod在集群節(jié)點中的調(diào)度分配。
    
  • node
        kubelet: 負(fù)責(zé)本node節(jié)點上的Pod的創(chuàng)建、修改、監(jiān)控、刪除等全生命周期管理,同時kubelet同時上報kubelet定時上報本node的狀態(tài)信息到API Server。
        Proxy: 實現(xiàn)Service的代理及軟件模式的負(fù)載均衡器
    
  • k8s各個組件之間的交互關(guān)系:以RC為例


    service與pod,rc關(guān)系ww

Service、RC(Deployment)、Pod對象如何構(gòu)成完整的服務(wù)

組件交互關(guān)系ww

Pod,RC(Deployment)、Service對象如何編寫構(gòu)建 --詳見對象編寫篇

Pod通信問題

  • Pod內(nèi)容器之間的通信問題

    - 共享卷:操作方式-將共同讀、寫文件“映射”至宿主機(jī)共同目錄下。
    - 進(jìn)程間通信(IPC):同Pod下多容器共享同一個IPC命名空間,意味著他們也可以互相使用標(biāo)準(zhǔn)進(jìn)程間通信,如SystemV信號系統(tǒng)或POSIX共享內(nèi)存
    - 容器間網(wǎng)絡(luò)通信(UTS):同Pod下多容器共享同一個UTS命名空間,多容器之間可利用localhost:。
    
  • Pod與Pod間通信:均可使用PodIp:Port形式配置使用

    • 兩個Pod在同一node上
    docker默認(rèn)的docker網(wǎng)橋互連容器
    
    • 兩Pod分布在不同node上;配置PodIp:Port形式
    - 官方推薦fannel組建一個大二層扁平網(wǎng)絡(luò),pod的ip分配由flannel統(tǒng)一分配,通信過程走flannel網(wǎng)橋。每個node 上會創(chuàng)建一個flannel虛擬網(wǎng)卡,用于跨node之間通訊。所以容器直接可以直接使用pod id進(jìn)行通訊。
    - 一種方式,為每個Pod創(chuàng)建Service提供服務(wù)。
    
  • Pod中容器與集群外服務(wù)通信 -- 存在疑慮,待一起討論學(xué)習(xí)
    為需要與外部服務(wù)通信的Pod創(chuàng)建Service,但不帶標(biāo)簽選擇器,進(jìn)行手動創(chuàng)建連接的后端服務(wù)(集群外服務(wù)) --與Service同名

    • Endpoint 方法適合外部服務(wù)是IP的情況
      apiVersion: v1
      kind: Service
      metadata:
      name: mysql-production
      spec:
      ports:
          - port: 3306
      ---
      kind: Endpoints
      apiVersion: v1
      metadata:
      name: mysql-production
      namespace: default
      subsets:
      - addresses:
          - ip: 192.168.1.25
          ports:
          - port: 3306
    
    • tpye:ExternalName
    kind: Service
    apiVersion: v1
    metadata:
      name: svc1
      namespace: default
    spec:
      type: ExternalName
      externalName: somedomain.org
    
  • kubectl 常用管理語法

    描述 語法
    查看資源信息 kubectl get pods|services|namespaces|nodes|[--all-namespaces|-n NAMESPACE_NAME]
    查看資源具體信息 kubectl describe pods|services|namespaces|nodes
    獲取指定pod容器日志信息 kubectl logs POD_NAME CON_NAME -n NAMESPACE_NAME
    創(chuàng)建/刪除資源對象 kubectl create|apply/delete -f /PATH/TO/YMLFILE [--validate]
    查詢集群信息/日志信息 kubectl cluster-info [dump]
    獲取pod運(yùn)行在那個節(jié)點 kubectl get pods --all-namespaces -o wide
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容