日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Kubernetes学习

發布時間:2024/3/12 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Kubernetes学习 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

發展歷史

Infrastructure as a Service 阿里云
platform as a Service 新浪云
Software as Service Office365

資源管理器

  • Apache MESOS 分布式的資源管理框架 2019-05 最大使用廠商Twitter不在使用,改為Kubernetes
  • Docker Swarm 與Docker綁定 2019-07 阿里云宣布Docker Swarm 從阿里選擇列表里剔除
  • Kubernetes Google 2014年創建管理的,是Google 10多年大規模容器管理技術Borg的開源版本

Kerbernetes是什么

??Kubernetes是容器集群管理系統,是一個開源的平臺,可以實現容器集群的自動化部署、自動擴縮容、維護等功能。

Kubernetes特點

  • 可移植: 支持公有云,私有云,混合云,多重云(multi-cloud)
  • 可擴展: 模塊化, 插件化, 可掛載, 可組合
  • 自動化: 自動部署,自動重啟,自動復制,自動伸縮/擴展
  • 輕量級: 消耗資源小
  • 負載均衡: IPVS

Kubernetes組件說明

Borg架構

k8s架構

Master組件

  • etcd
    ??etcd的官方將它定位 成一個可信賴的分布式鍵值存儲服務. etcd是Kubernetes提供默認的存儲系統,它能夠為整個分布式集群存儲一些關鍵數據,協助分布式集群的正常運轉.
  • scheduler
    ??負責資源的調度,監視新創建沒有分配到Node的Pod,為Pod選擇一個Node.
  • controller manager
    ??負責維護集群的狀態,比如故障檢測、自動擴展、滾動更新等.
  • api server
    ??提供了資源操作的唯一入口,并提供認證、授權、訪問控制、API注冊和發現等機制.

Node組件

  • kubelet
    ??負責維護容器的生命周期,同時也負責Volume(CVI)和網絡(CNI)的管理.
  • kube-proxy
    ??負責為Service提供cluster內部的服務發現和負載均衡.
  • **Container **
    ??runtime負責鏡像管理以及Pod和容器的真正運行(CRI).

其它插件說明

  • DNS
    ??負責為整個集群提供DNS服務.
  • Dashboard
    ??提供GUI.
  • Ingress Controller
    ??為服務提供外網入口.
  • Federation
    ??提供跨可用區的集群.

搭建k8s集群

前置知識點

??目前生產部署Kubernetes集群主要有兩種方式:

  • kubeadm
    ??Kubeadm是一個k8s部署工具,提供kubeadm init 和 kubeadm join ,用于快速部署Kubernetes集群.
    官方地址: https://kubernetes.io/docs/reference/setup-tools/kubeadm/
  • 二進制包
    ??從github上下載發行版的二進制包,手動部署每個組件,組成Kubernetes集群.
    ??Kubeadm降低部署門檻,但屏蔽了很多細節,遇到問題很難排查.如果想更容易可控,推薦使用二進制包部署Kubernetes集群,雖然手動部署麻煩點,期間可以學習很多工作原理,也利于后期維護.
  • kubeadm 部署方式介紹

    ??kubeadm是官方社區推出的一款用于快速部署Kubernetes集群的工具,這個工具能夠通過兩條指令完成一個Kubernetes集群的部署.

    • 創建一個Master節點 kubeadm init
    • 將Node節點加入到當前集群中 kubeadm join <Master節點的IP和端口>

    安裝要求

    在開始之前,部署Kubernetes集群集群需要滿足以下幾個條件:

    • 一臺或多臺機器, 操作系統Centos7.x
    • 硬件配置:2核4G或更高配置
    • 集群中所有機器之間網絡互通
    • 可以訪問外網,需要拉去鏡像
    • 禁止swap分區

    環境準備

  • 在所有節點上安裝Docker 和 Kubeadm
  • 部署Kubernetes Master
  • 部署容器網絡插件
  • 部署Kubernetes Node, 將節點加入Kubernetes集群中
  • 部署Dashboard Web頁面,可視化查看Kubernetes資源
  • 關閉防火墻

    systemctl stop firewalld systemctl disable firewalld

    關閉selinux

    sed -i 's/enforcing/disabled/' /etc/selinux/config # 永久 setenforce 0 # 臨時

    關閉swap

    sudo sed -ri 's/.*swap.*/#&/' /etc/fstab # 永久 sudo swapoff -a # 臨時

    根據規劃設置主機名

    # 設置 hostnamectl set-hostname <hostname> # 查看 hostname

    分別為:
    hostnamectl set-hostname master1
    hostnamectl set-hostname node1
    hostnamectl set-hostname node2

    在 master 添加 hosts

    cat >> /etc/hosts << EOF 120.25.169.231 master1 120.24.221.223 node1 120.25.205.141 node2 EOF

    將橋接的IPv4流量傳遞到iptables的鏈

    cat > /etc/sysctl.d/k8s.conf << EOF net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOFsysctl --system # 生效

    時間同步

    yum install ntpdate -y #yum更新ntpdate ntp1.aliyun.com #時間同步

    所有節點安裝Docker/kubeadm/kubelet

    ??Kubernetes默認 CRI(容器運行時)為Docker,因此先安裝Docker。

    安裝Docker

    # centos wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo yum -y install docker-ce-18.06.1.ce-3.el7 systemctl enable docker && systemctl start docker docker --version #Docker version 18.06.1-ce, build e68fc7a

    設置Kubernetes鏡像源

    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=0 repo_gpgcheck=0 gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg EOF

    配置鏡像加速器

    sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' {"registry-mirrors": ["https://1k8zbux8.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker

    安裝kubeadm,kubelet和kubectl

    yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0 systemctl enable kubelet #開機啟動

    部署Kubernetes Master

    Master節點執行.如果是阿里云服務器這里的apiserve需要修改成自己的master內網地址

    kubeadm init \ --apiserver-advertise-address=172.28.117.97 \ --image-repository registry.aliyuncs.com/google_containers \ --kubernetes-version v1.18.0 \ --service-cidr=10.1.0.0/16 \ --pod-network-cidr=10.244.0.0/16

    出現如下信息表示成功

    Your Kubernetes control-plane has initialized successfully!To start using your cluster, you need to run the following as a regular user:mkdir -p $HOME/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/configYou should now deploy a pod network to the cluster. Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:https://kubernetes.io/docs/concepts/cluster-administration/addons/Then you can join any number of worker nodes by running the following on each as root:kubeadm join 172.28.117.97:6443 --token u9e5os.l9tozto1jh4n8bn7 \--discovery-token-ca-cert-hash sha256:dc644816ced7b82013ac3a6b1d2ad7467b7d33b7e1693dd1d82c9f9126668392

    按照提示配置一下內容, 使用kubectl工具:

    mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config

    加入Kubernetes Node

    Node節點執行

    kubeadm join 172.28.117.97:6443 --token u9e5os.l9tozto1jh4n8bn7 \--discovery-token-ca-cert-hash sha256:dc644816ced7b82013ac3a6b1d2ad7467b7d33b7e1693dd1d82c9f9126668392

    默認token有效期為24小時,當過期之后,該token就不可用了。這時就需要重新創建token,操作如下:
    kubeadm token create --print-join-command

    部署CNI網絡插件

    kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

    查看

    [root@master1 ~]# kubectl get pods -n kube-system NAME READY STATUS RESTARTS AGE coredns-7ff77c879f-m48fj 1/1 Running 0 2m46s coredns-7ff77c879f-rn6p8 1/1 Running 0 2m46s etcd-master1 1/1 Running 0 2m55s kube-apiserver-master1 1/1 Running 0 2m55s kube-controller-manager-master1 1/1 Running 0 2m55s kube-flannel-ds-58fb4 1/1 Running 0 83s kube-flannel-ds-782gl 1/1 Running 0 83s kube-flannel-ds-qwft4 1/1 Running 0 83s kube-proxy-455lf 1/1 Running 0 2m35s kube-proxy-dtbbc 1/1 Running 0 2m31s kube-proxy-kn7s8 1/1 Running 0 2m46s kube-scheduler-master1 1/1 Running 0 2m55s[root@master1 ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION master1 Ready master 5m5s v1.18.0 node1 Ready <none> 4m36s v1.18.0 node2 Ready <none> 4m32s v1.18.0

    測試Kubernetes集群
    在Kubernetes集群中創建一個pod,驗證是否正常運行

    kubectl create deployment nginx --image=nginx kubectl expose deployment nginx --port=80 --type=NodePort [root@master1 ~]# kubectl get pod,svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/kubernetes ClusterIP 10.1.0.1 <none> 443/TCP 10m service/nginx NodePort 10.1.108.14 <none> 80:32071/TCP 31s [root@master1 ~]# kubectl get pod NAME READY STATUS RESTARTS AGE nginx-f89759699-krhl7 1/1 Running 0 4m5s

    訪問地址: http://NodePort:Port
    http://120.25.169.231:32071/
    http://120.24.221.223:32071/
    http://120.25.205.141:32071/

    資源類型

    什么是資源?

    k8s中的所有內容都被抽象為資源,資源實例化之后叫做對象.

    k8s中存在哪些資源

    名稱空間級別

    工作負載型資源(workload):Pod,ReplicaSet,Deployment,StatefulSet,DaemonSet,Job,CronJob

    服務發現及負載均衡型資源(ServiceDiscovery LoadBalance): Service, Ingress …

    配置與存儲型資源: Volume(存儲卷),CSI(容器存儲接口)

    特殊類型的存儲卷: ConfigMap(當配置中心來使用的資源類型),Secret(保存敏感數據),DownwardAPI(把外部環境中的信息輸出給容器)

    集群級別資源

    Namespace,Node,Role,ClusterRole,RoleBinding,ClusterRoleBinding

    元數據型資源

    HPA,PodTemplate,LimitRange

    資源清單

    資源清單的含義

    ??在k8s中,一般使用yaml格式的文件來創建符合我們預期期望的pod,這樣yaml文件我們一般稱為資源清單.

    必須存在的屬性

    參數名字段類型說明
    versionString這里指的是K8s API的版本,目前基本上是v1,可以用kubectl api-versions 命令查詢
    kindString這里指的是yaml文件定義的資源類型和角色,比如: Pod
    metadataObject元數據對象,固定值就寫metadata
    metadata.nameString元數據對象的名字,這里由我們編寫,比如命名Pod的名字
    metadata.namespaceString元數據對象的命名空間,由我們自身定義
    specObject詳細定義對象,固定值就寫spec
    spec.containers[]list這里是spec對象的容器列表定義,是個列表
    spec.containers[].nameString這里定義容器的名字
    spec.containers[].imageString這里定義要用到的鏡像名稱

    示例:pod.yaml

    apiVersion: v1 kind: Pod metadata: name: myapp-podnamespace: defaultlabels: app: myappversion: v1spec:containers:- name: appimage: nginx- name: storeimage: mysql

    容器生命周期


    InitC
    Pod 能夠具有多個容器,應用運行在容器里面,但是他也有可能有一個或多個先于應用容器啟動的Init容器.

    Init容器與普通的容器非常像,除了以下兩點:
    ??1. Init容器總是運行到成功完成為止.
    ??2. 每個Init容器都必須在下一個Init容器啟動之前完成.

    如果Pod的init容器啟動失敗,Kubernetes會不斷的重啟該Pod,直到Init容器成功為止.然而,
    如果Pod對應的restartPolicy為Never,它不會重新啟動.

    Kubernetes Volume

    默認情況下容器中的磁盤文件是非持久化的,對于運行在容器中的應用來說面臨兩個問題:

  • 當容器掛掉kubelet將重啟啟動它時,文件將會丟失;
  • 當Pod中同時運行多個容器,容器之間需要共享文件時。Kubernetes的Volume解決了這兩個問題。
  • Kubernetes Volume具有明確的生命周期 - 與pod相同。因此,Volume的生命周期比Pod中運行的任何容器要持久,在容器重新啟動時能可以保留數據,當然,當Pod被刪除不存在時,Volume也將消失。注意,Kubernetes支持許多類型的Volume,Pod可以同時使用任意類型/數量的Volume。

    要使用Volume,pod需要指定Volume的類型和內容(spec.volumes字段),和映射到容器的位置(spec.containers.volumeMounts字段)

    Volume 類型

    emptyDir

    使用emptyDir,當Pod分配到Node上時,將會創建emptyDir,并且只要Node上的Pod一直運行,Volume就會一直存。當Pod(不管任何原因)從Node上被刪除時,emptyDir也同時會刪除,存儲的數據也將永久刪除。注:刪除容器不影響emptyDir。

    示例

    apiVersion: v1 kind: Pod metadata:name: test-pd spec:containers:- image: gcr.io/google_containers/test-webservername: test-containervolumeMounts:- mountPath: /cachename: cache-volumevolumes:- name: cache-volumeemptyDir: {}

    hostPath

    hostPath允許掛載Node上的文件系統到Pod里面去。如果Pod需要使用Node上的文件,可以使用hostPath。

    示例

    apiVersion: v1 kind: Pod metadata:name: test-pd spec:containers:- image: gcr.io/google_containers/test-webservername: test-containervolumeMounts:- mountPath: /test-pdname: test-volumevolumes:- name: test-volumehostPath:# directory location on hostpath: /data

    gitRepo

    gitRepo volume將git代碼下拉到指定的容器路徑中。

    示例:

    apiVersion: v1 kind: Pod metadata:name: server spec:containers:- image: nginxname: nginxvolumeMounts:- mountPath: /mypathname: git-volumevolumes:- name: git-volumegitRepo:repository: "git@somewhere:me/my-git-repository.git"revision: "22f1d8406d464b0c0874075539c1f2e96c253775"

    推薦閱讀:https://www.infoq.cn/article/KNMAVdo3jXs3qPKqTZBw

    總結

    以上是生活随笔為你收集整理的Kubernetes学习的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。