学习资料

1、 Kubernetes详细教程:

https://gitee.com/yooome/golang/blob/main/k8s详细教程/Kubernetes详细教程.md#1-kubernetes介绍

学习笔记

1、k8s的背景:

容器化部署方式给带来很多的便利,但是也会出现一些问题,比如说:

  • 一个容器故障停机了,怎么样让另外一个容器立刻启动去替补停机的容器
  • 当并发访问量变大的时候,怎么样做到横向扩展容器数量

这些容器管理的问题统称为容器编排问题,为了解决这些容器编排问题,就产生了一些容器编排的软件:

  • Swarm:Docker自己的容器编排工具
  • Mesos:Apache的一个资源统一管控的工具,需要和Marathon结合使用
  • Kubernetes:Google开源的的容器编排工具
  • OpenShift:红帽RedHat公司开发的容器应用平台,OKD是其发行版。

其中,k8s占比超过了70%,成为了事实上的业界标准。

2、

安装部署 K8S

链接: https://www.cnblogs.com/Sunzz/p/15184167.html

k8s组件介绍

RUNOOB 图标

K8S中的Master是集群控制节点,负责整个集群的管理和控制
ApiServer : 资源操作的唯一入口,接收用户输入的命令,提供认证、授权、API注册和发现等机制,其他模块通过API Server查询或修改数据,只有API Server才直接和etcd进行交互;
Scheduler : 负责集群资源调度,通过API Server的Watch接口监听新建Pod副本信息,按照预定的调度策略将Pod调度到相应的node节点上;
ControllerManager : K8S里所有资源对象的自动化控制中心,通过 api-server 提供的 restful 接口实时监控集群内每个资源对象的状态,发生故障时,导致资源对象的工作状态发生变化,就进行干预,尝试将资源对象从当前状态恢复为预期的工作状态,常见的 controller 有 Namespace Controller、Node Controller、Service Controller、ServiceAccount Controller、Token Controller、ResourceQuote Controller、Replication Controller等;
Etcd: 是Kubernetes的存储状态的数据库(所有master的持续状态都存在etcd的一个实例中);
Node: 是K8S集群中的工作负载节点,每个Node都会被Master分配一些工作负载,当某个Node宕机时,其上的工作负载会被Master自动转移到其他节点上;
Kubelet: 负责维护容器的生命周期,即通过控制docker,控制Pod 的创建、启动、监控、重启、销毁等工作,处理Master节点下发到本节点的任务;
KubeProxy : 负责制定数据包的转发策略,并以守护进程的模式对各个节点的pod信息实时监控并更新转发规则,service收到请求后会根据kube-proxy制定好的策略来进行请求的转发,从而实现负载均衡,总的来说,负责为Service提供cluster内部的服务发现和负载均衡;
Docker : 负责节点上容器的各种操作;

其他组件:
Pod: kubernetes的最小控制单元,容器都是运行在pod中的,一个pod中可以有1个或者多个容器;
Controller: 控制器,通过它来实现对pod的管理,比如启动pod、停止pod、伸缩pod的数量等等;
Service: pod对外服务的统一入口,下面可以维护者同一类的多个pod;
Label: 标签,用于对pod进行分类,同一类pod会拥有相同的标签;
NameSpace: 命名空间,用来隔离pod的运行环境;

什么是服务化?

SOA(Service-Oriented Architecture,面向服务架构)

浅谈服务化和微服务化:

https://zhuanlan.zhihu.com/p/59368481

https://zhuanlan.zhihu.com/p/59564115

Overlay & Underlay网络

https://www.51cto.com/article/716550.html

kubelet

说明:服务,用来调用下层的container管理器,从而对底层容器进行管理。

kubeadm

说明:Kubeadm 是一个K8s 部署工具,提供 kubeadm init 和 kubeadm join,用于快速部署 Kubernetes 集群。

官方地址:https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/

这个工具能通过两条指令完成一个kubernetes 集群的部署:

  • 创建一个 Master 节点:kubeadm init
  • 将 Node 节点加入到当前集群中:kubeadm join <Master 节点的IP 和端口>

kubectl

说明:是使用 Kubernetes API 与 Kubernetes 集群的控制面进行通信的命令行工具。

配置信息:$HOME/.kube/config

config是默认的名称,也可以自行指定,方式为:

export KUBECONFIG="${KUBECONFIG}:${HOME}/.kube/myconfig"

config的内容如下:(主要存放了用户名称以及访问凭据等等信息)

apiVersion: v1
kind: Config
preferences: {}
clusters:
  - cluster:
      certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUMvakNDQWVhZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwcmRXSmwKY201bGRHVnpNQjRYRFRJek1ERXpNVEF5TlRrME5Wb1hEVE16TURFeU9EQXlOVGswTlZvd0ZURVRNQkVHQTFVRQpBeE1LYTNWaVpYSnVaWFJsY3pDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTWlyCm9scGhxVUxBNXFuWndocGlod2ZGcmg1WFVMSzg0M2ltZkVEa2laUFdQRzhIU0tFWHpjK25menFTb3J4V3dWL1YKWkpkR2dncThUNERKc3EzOURuRE50RjcrYVBKa2xyUU1QRTY4NnNvOWl5MXJHalMwUk9sR2ZtSFVzQ0xkZ1lxYwpGVHFnOThYcWxXUldvdGlEWmE3TFZydUx2RHNRUkU1MkQweStEVTREMnFzYTNWNEYySlgvcUFGSGMwNFhUbDRMCkIvaGFDQ0VUekNncEd1R1VuRGZQUzBaZXJxczNuNjF4dDJaSUxXY1F0aXFOUnNmcndrbzlsb2hla0hHSjdiRDkKMlB1ZWZtRy85ZHdMSGZQaGE5cUFnTThlUWllUVhUQ1BHSFFLeCt3dEZZWC9OeFNWTzVDZUh1alNyL1BVNGxvVQpieFprZUs3bTJaYk1vYjZyVXBFQ0F3RUFBYU5aTUZjd0RnWURWUjBQQVFIL0JBUURBZ0trTUE4R0ExVWRFd0VCCi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZBMDFCSXVQZkdXaHBVdmF5YWU5Z1MxU0h1ellNQlVHQTFVZEVRUU8KTUF5Q0NtdDFZbVZ5Ym1WMFpYTXdEUVlKS29aSWh2Y05BUUVMQlFBRGdnRUJBRndVQ0ZaL3Y1RWhxdHlBejR6NQo3RHBpOW9XeEh2OU5KVzArc2tzb1NBWmFNL2Vrem1WZzFEQXFpaTFrbnJNT0c4QjhOYzA0N1N1eFNjMHNRVnlTCkpHd1NIdk9Fa08yYTdjV2VaUHQvcUNCNVNscEc3Q0poVlJlUGRJL1Q1allSdk0vRG5Fc2JndWgvVVFWc1hFVTUKMVB6UmkvK3VzcFgyMHNDb2VmSHhJRTVmMElrNTlLUnlteWh1aTRGbFBPaGs0YzVidjRNbkhlT055L2tURERaQQo1dmlCdjNGZlRhQlBIT0lBdUljTlV5cVFEdXJRTDJQall3QVUwTmVuQjZiRzI0azB0RjhtSFRCNURmbW9lSkYvCkltdEJYOTF4MU9heFppTytvM2w1NEZlRkNhTEU3U0JCaUl5Qm5xRWJ0OWE1cExkd2lZZkQ4UTNGRGcrbTc4Y1UKU2ljPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
      server: https://51.32.26.169:16443
    name: test02
contexts:
  - context:
      cluster: test02
      user: admin
    name: admin@test02
current-context: admin@test02
users:
  - name: admin
    user:
      token: krm:AAAAAQAAAAEAAAAAAAAABwAAAAIAAAAB9v/Td6fS0DczZO86TCSy+g8Zr4PUDmq7xunYzlIQndwAAABgAAAAAAAAAAC/ecetjYiJUfq6y+9bJ7gVbXBzir4GviEOvNDBcDmh1Vb4aH2v0BtsLGP8LBQ/CIb1YwxzM5Su4/sckUHhGNlns527ta3dL3iP4JWcAIgmnIbpzWYR9fXOxd7f9i8mzAcAAAABAAAAAAAACAQAAAACAAAAAYgKRw02jrj7atCFn/Rs/P0AAAAAAAAAAJsZLW6ussc5e8NYvbmtcAt2xnM6ukVFOsM5g4GBkCgf

kubectl 语法

格式:kubectl [command] [TYPE] [NAME] [flags]

command:指定要对一个或多个资源执行的操作,例如 creategetdescribedelete

TYPE:指定资源类型。资源类型不区分大小写, 可以指定单数、复数或缩写形式。以下命令输出相同的结果:

kubectl get pod pod1
kubectl get pods pod1
kubectl get po pod1

NAME:指定资源的名称。名称区分大小写。 如果省略名称,则显示所有资源的详细信息。例如:kubectl get pods

flags: 指定可选的参数。例如,可以使用 -s--server 参数指定 Kubernetes API 服务器的地址和端口。

常用操作:

1、kubectl apply - 以文件或标准输入为准应用或更新资源。

# 使用 example-service.yaml 中的定义创建服务。
kubectl apply -f example-service.yaml

# 使用 example-controller.yaml 中的定义创建 replication controller。
kubectl apply -f example-controller.yaml

# 使用 <directory> 路径下的任意 .yaml、.yml 或 .json 文件 创建对象。
kubectl apply -f <directory>

2、kubectl get - 列出一个或多个资源。

kubectl get ns           # 命名空间
kubectl get pods         # pod
kubectl get nodes        # 节点
kubectl get rc           # ReplicationController
kubectl get rs           # ReplicaSet
kubectl get services     # 服务

注:上面的get查询都可以指定 -n 或者 -namespace 参数指定对应的命名空间。

# 以纯文本输出格式列出所有 Pod。
kubectl get pods
------------------------------------------------------------
[root@test02-master-fezsp gandalf]# kubectl get pods
NAME                                                  READY   STATUS    RESTARTS   AGE
app-sample-appsample-servletsample-6c9d9c4766-dnpr8   1/1     Running   0          41h
app-sample-appsample-servletsample-6c9d9c4766-pnsqk   1/1     Running   0          41h

# 以纯文本输出格式列出所有 Pod,并包含附加信息(如节点名)。
kubectl get pods -o wide
------------------------------------------------------------
[root@test02-master-fezsp gandalf]# kubectl get pods -o wide
NAME                                                  READY   STATUS    RESTARTS   AGE   IP              NODE                     NOMINATED NODE   READINESS GATES
app-sample-appsample-servletsample-6c9d9c4766-dnpr8   1/1     Running   0          41h   10.234.73.195   test02-work-pool-bqxnv   <none>           <none>
app-sample-appsample-servletsample-6c9d9c4766-pnsqk   1/1     Running   0          41h   10.234.73.194   test02-work-pool-bqxnv   <none>           <none>

# 以纯文本输出格式列出所有 Namespace
kubectl get ns

# 以纯文本输出格式列出具有指定名称的副本控制器。提示:你可以使用别名 'rc' 缩短和替换 'replicationcontroller' 资源类型。
kubectl get replicationcontroller <rc-name>

# 以纯文本输出格式列出所有副本控制器和服务。
kubectl get rc,services
------------------------------------------------------------
[root@test02-master-fezsp gandalf]# kubectl get rc,services
NAME                                         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
service/app-sample-appsample-servletsample   NodePort    10.233.121.121   <none>        8080:31463/TCP   41h
service/kubernetes                           ClusterIP   10.233.64.1      <none>        443/TCP          44d

# 以纯文本输出格式列出所有守护程序集,包括未初始化的守护程序集。
kubectl get ds --include-uninitialized

# 列出在节点 server01 上运行的所有 Pod
kubectl get pods --field-selector=spec.nodeName=server01

3、kubectl describe - 显示一个或多个资源的详细状态,默认情况下包括未初始化的资源。

# 显示名为 <pod-name> 的 Pod 的详细信息。
kubectl describe nodes <node-name>

# 显示名为 <pod-name> 的 Pod 的详细信息。
kubectl describe pods/<pod-name>

# 显示由名为 <rc-name> 的副本控制器管理的所有 Pod 的详细信息。
# 记住:副本控制器创建的任何 Pod 都以副本控制器的名称为前缀。
kubectl describe pods <rc-name>

# 描述所有的 Pod
kubectl describe pods

4、kubectl delete - 基于文件、标准输入或通过指定标签选择器、名称、资源选择器或资源来删除资源。

# 使用 pod.yaml 文件中指定的类型和名称删除 Pod。
kubectl delete -f pod.yaml

# 删除所有带有 '<label-key>=<label-value>' 标签的 Pod 和服务。
kubectl delete pods,services -l <label-key>=<label-value>

# 删除所有 Pod,包括未初始化的 Pod。
kubectl delete pods --all

5、kubectl exec - 对 Pod 中的容器执行命令。

# 从 Pod <pod-name> 中获取运行 'date' 的输出。默认情况下,输出来自第一个容器。
kubectl exec <pod-name> -- date

# 运行输出 'date' 获取在 Pod <pod-name> 中容器 <container-name> 的输出。
kubectl exec <pod-name> -c <container-name> -- date

# 获取一个交互 TTY 并在 Pod  <pod-name> 中运行 /bin/bash。默认情况下,输出来自第一个容器。
kubectl exec -it <pod-name> -- /bin/bash

6、kubectl logs - 打印 Pod 中容器的日志。

# 返回 Pod <pod-name> 的日志快照。
kubectl logs <pod-name>

# 从 Pod <pod-name> 开始流式传输日志。这类似于 'tail -f' Linux 命令。
kubectl logs -f <pod-name>

7、kubectl diff - 查看集群建议更新的差异。

# “pod.json”中包含的差异资源。
kubectl diff -f pod.json

# 从标准输入读取的差异文件。
cat service.yaml | kubectl diff -f -

工作负载

Deployment

StatefulSet

DaemonSet

Job/CronJob

Deployment.yml 字段解析

apiVersion: v1       #必填,版本号,例如v1
kind: Depolyment     #必填
metadata:       #必填,元数据
  name: string       #必填,Pod名称
  namespace: string    #必填,Pod所属的命名空间
  labels:      #自定义标签
    - name: string     #自定义标签名字<key: value>
  annotations:       #自定义注释列表
    - name: string
spec:         #必填,部署的详细定义
  selector: 
    matchLabels:
      name: string #必填,通过此标签匹配对应pod<key: value>
  replicas: number #必填,副本数量
  template: #必填,应用容器模版定义
    metadata: 
      labels: 
        name: string #必填,与上面matchLabels的标签相同
    spec: 
      containers:      #必填,定义容器列表
      - name: string     #必填,容器名称
        image: string    #必填,容器的镜像名称
        imagePullPolicy: [Always | Never | IfNotPresent] #获取镜像的策略 Alawys表示下载镜像 IfnotPresent表示优先使用本地镜像,否则下载镜像,Nerver表示仅使用本地镜像
        command: [string]    #容器的启动命令列表,如不指定,使用打包时使用的启动命令
        args: [string]     #容器的启动命令参数列表
        workingDir: string     #选填,容器的工作目录
        env:       #容器运行前需设置的环境变量列表
        - name: string     #环境变量名称
          value: string    #环境变量的值
        ports:       #需要暴露的端口库号列表
        - name: string     #选填,端口号名称
          containerPort: int   #容器需要监听的端口号
          hostPort: int    #选填,容器所在主机需要监听的端口号,默认与Container相同
          protocol: string     #选填,端口协议,支持TCP和UDP,默认TCP
        resources:       #资源限制和请求的设置
          limits:      #资源限制的设置
            cpu: string    #Cpu的限制,单位为core数,将用于docker run --cpu-shares参数
            memory: string     #内存限制,单位可以为Mib/Gib,将用于docker run --memory参数
          requests:      #资源请求的设置
            cpu: string    #Cpu请求,容器启动的初始可用数量
            memory: string     #内存清楚,容器启动的初始可用数量
        volumeMounts:    #挂载到容器内部的存储卷配置
        - name: string     #引用pod定义的共享存储卷的名称,需用volumes[]部分定义的的卷名
          mountPath: string    #存储卷在容器内mount的绝对路径,应少于512字符
          readOnly: boolean    #是否为只读模式
        livenessProbe:     #对Pod内个容器健康检查的设置,当探测无响应几次后将自动重启该容器,检查方法有exec、httpGet和tcpSocket,对一个容器只需设置其中一种方法即可
          exec:      #对Pod容器内检查方式设置为exec方式
            command: [string]  #exec方式需要制定的命令或脚本
          httpGet:       #对Pod内个容器健康检查方法设置为HttpGet,需要制定Path、port
            path: string
            port: number
            host: string
            scheme: string
            HttpHeaders:
            - name: string
              value: string
          tcpSocket:     #对Pod内个容器健康检查方式设置为tcpSocket方式
            port: number
          initialDelaySeconds: 0  #容器启动完成后首次探测的时间,单位为秒
          timeoutSeconds: 0   #对容器健康检查探测等待响应的超时时间,单位秒,默认1秒
          periodSeconds: 0    #对容器监控检查的定期探测时间设置,单位秒,默认10秒一次
          successThreshold: 0
          failureThreshold: 0
          securityContext:
            privileged:false
        #Pod的重启策略,Always表示一旦不管以何种方式终止运行,kubelet都将重启,OnFailure表示只有Pod以非0退出码退出才重启,Nerver表示不再重启该Pod
        restartPolicy: [Always | Never | OnFailure]
        nodeSelector: obeject  #设置NodeSelector表示将该Pod调度到包含这个label的node上,以key:value的格式指定
        imagePullSecrets:    #Pull镜像时使用的secret名称,以key:secretkey格式指定
        - name: string
        hostNetwork:false      #是否使用主机网络模式,默认为false,如果设置为true,表示使用宿主机网络
        volumes:       #在该pod上定义共享存储卷列表
        - name: string     #共享存储卷名称 (volumes类型有很多种)
          emptyDir: {}     #类型为emtyDir的存储卷,与Pod同生命周期的一个临时目录。为空值
          hostPath: string     #类型为hostPath的存储卷,表示挂载Pod所在宿主机的目录
            path: string     #Pod所在宿主机的目录,将被用于同期中mount的目录
        - name: string     #共享存储卷名称
          secret:      #类型为secret的存储卷,挂载集群与定义的secre对象到容器内部
            scretname: string  
            items:     
            - key: string     #选择secrets定义的某个key
              path: string    #文件内容路径
        - name: string     #共享存储卷名称
          configMap:     #类型为configMap的存储卷,挂载预定义的configMap对象到容器内部
            name: string
            items:
            - key: string     #选择configmap定义的某个key
              path: string     #文件内容路径
        - name: string     #共享存储卷名称
          persistentVolumeClaim:
            claimName: string     #类型为PVC的持久化存储卷

Helm

说明

Helm是一个为K8s进行包管理的工具。Helm将yaml作为一个整体管理并实现了这些yaml的高效复用,就像Linux中的yum或apt-get,它使我们能够在K8s中方便快捷的安装、管理、卸载K8s应用。Helm 是查找、分享和使用软件构建 Kubernetes 的最优方式。

三个重要概念

Chart:代表Helm包。它包含在K8s集群内部运行应用程序、工具或服务所需的所有的资源定义。可以类比成yum中的RPM。

Repository:用来存放和共享Chart的地方。可以类比成Maven仓库。

Release:运行在K8s集群中的Chart的实例,一个Chart可以在同一个集群中安装多次。Chart就像流水线中初始化好的模板,Release就是这个“模板”所生产出来的各个产品。

目录结构

假设我们的Chart名称叫做myChart,我们可以使用下面的命令创建一个初始的模板工程:

$ Helm create myChart

在当前目录下会新建一个 myChart 的目录,目录结构如下:

[d]charts
[f]Chart.yaml
[d]templates
	[f]deployment.yaml
	[f]_helpers.tpl
	[f]hpa.yaml
	[f]ingress.yaml
	[f]NOTES.txt
	[f]serviceaccount.yaml
	[f]service.yaml
	[d]tests
		[f]test-connection.yaml
[f]values.yaml

★ templates/ 目录包含了模板文件。Helm会通过模板渲染引擎渲染所有该目录下的文件来生成Chart,之后将收集到的模板渲染结果发送给K8s。

★ values.yaml 文件对于模板也非常重要。这个文件包含了对于一个Chart的默认值 。这些值可以在用户执行 Helm install 或 Helm upgrade 时指定新的值来进行覆盖。

★ Chart.yaml 文件包含对于该 Chart 元数据描述。这些描述信息可以在模板中被引用。

★ _helper.tpl 包含了一些可以在 Chart 中进行复用的模板定义。

★ 其他诸如 deployment.yaml、service.yaml、ingress.yaml 文件,就是我们用于生成K8s配置文件的模板,Helm 默认会按照如下的顺序将生成资源配置发送给K8s:

Namespace -> NetworkPolicy -> ResourceQuota -> LimitRange -> PodSecurityPolicy --> PodDisruptionBudget -> ServiceAccount -> Secret -> SecretList -> ConfigMap -> StorageClass -> PersistentVolume -> PersistentVolumeClaim -> CustomResourceDefinition -> ClusterRole -> ClusterRoleList -> ClusterRoleBinding -> ClusterRoleBindingList -> Role -> RoleList -> RoleBinding -> RoleBindingList -> Service -> DaemonSet -> Pod -> ReplicationController -> ReplicaSet -> Deployment -> HorizontalPodAutoscaler -> StatefulSet -> Job -> CronJob -> Ingress -> APIService

基本语法

  • helm --help:查看helm的帮助信息

  • helm search: search for charts,在Helm仓库中查找应用

  • helm pull: download a chart to your local directory to view

  • helm install: upload the chart to Kubernetes,安装Helm

  • helm list: list releases of charts,罗列K8s集群中的部署的Release列表

  • helm lint: 对一个Helm Chart进行语法检查和校验

  • helm create: 创建一个Helm Chart初始安装包工程

Helm实战

首先我们准备一个自己构建的第三方镜像仓库的镜像,假设这个镜像已经存在于k8s的镜像仓库中,如下:

[root@test01-master-jcpcc gandalf]# isula images
REPOSITORY                                          TAG           IMAGE ID             CREATED              SIZE       
51.32.*:7443/test/registry/http_auth           1.0           303e9a6c6f45         2022-12-23 09:34:30  25.018MB 

该镜像在K8s下的 deployment.yaml 配置文件内容如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: third-part repository
  namespace: shenjl-test
  labels:
    name: repo-basic-auth
spec:
  replicas: 1
  selector:
    matchLabels:
      name: my-auth-registry
  template:
    metadata:
      labels:
        name: my-auth-registry
    spec:
      containers:
        - name: container-registry
          image: 51.32.16.195:7443/library/registry/https_auth:51.32.16.113
          ports:
            - containerPort: 5000

注:spec.selector.matchLabels值和spec.template.metadata.lables值完全匹配才是正确的写法,不会报错。

初始化工程语法分析:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ include "myChart.fullname" . }}
  labels:
    {{- include "myChart.labels" . | nindent 4 }}
spec:
  {{- if not .Values.autoscaling.enabled }}
  replicas: {{ .Values.replicaCount }}
  {{- end }}
  selector:
    matchLabels:
      {{- include "myChart.selectorLabels" . | nindent 6 }}
  template:
    metadata:
      {{- with .Values.podAnnotations }}
      annotations:
        {{- toYaml . | nindent 8 }}
      {{- end }}
      labels:
        {{- include "myChart.selectorLabels" . | nindent 8 }}
    spec:
      {{- with .Values.imagePullSecrets }}
      imagePullSecrets:
        {{- toYaml . | nindent 8 }}
      {{- end }}
      serviceAccountName: {{ include "myChart.serviceAccountName" . }}
      securityContext:
        {{- toYaml .Values.podSecurityContext | nindent 8 }}
      containers:
        - name: {{ .Chart.Name }}
          securityContext:
            {{- toYaml .Values.securityContext | nindent 12 }}
          image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
          imagePullPolicy: {{ .Values.image.pullPolicy }}
          ports:
            - name: http
              containerPort: 80
              protocol: TCP
          livenessProbe:
            httpGet:
              path: /
              port: http
          readinessProbe:
            httpGet:
              path: /
              port: http
          resources:
            {{- toYaml .Values.resources | nindent 12 }}
      {{- with .Values.nodeSelector }}
      nodeSelector:
        {{- toYaml . | nindent 8 }}
      {{- end }}
      {{- with .Values.affinity }}
      affinity:
        {{- toYaml . | nindent 8 }}
      {{- end }}
      {{- with .Values.tolerations }}
      tolerations:
        {{- toYaml . | nindent 8 }}
      {{- end }}

注:{{}}是go的模板指令语法,以“{{ .Values.image.repository }}”为例,其中Values是Helm的内置对象,此处“.Values”可理解为工程内的values.yaml文件,image.repository表示访问其中image片段下的repository的值,Helm在渲染时会自动进行替换。

Helm Chart包下载

说明:类似于github和dockerhub的chart的仓库。

地址:https://artifacthub.io/

下载方式:搜索框中输入想要查找的chart包的名称,如"tomcat",找到最多下载的那个,点击进去。点击"INSTALL",弹窗中提示了用Helm命令获取chart包的方式,可以直接点击右下角的"this link",即可下载完整的chart压缩包。

匹配的镜像:chart包详情页面的右侧边栏,查看"CONTAINERS IMAGES",即可获取该chart包依赖的匹配的镜像的地址,如:docker.io/bitnami/tomcat:10.1.7-debian-11-r0,可直接复制。

Q:学习笔记

1、同一个 pod 共享网络栈,端口不能冲突,可以直接使用 localhost 访问同一个 pod 的其他容器。

2、同一个 pod 共享存储。

3、每个 pod 都有一个默认的容器 pause。

pod 的控制器类型:

4、ReplicaSet(RS)比 ReplicationController(RC) 更加灵活,支持集合式的 selector。

5、deployment 支持滚动更新,以及回滚,通过控制 RS 来创建 pod。

6、无状态服务 Deployments & ReplicaSets

7、有状态服务 StatefulSet:

稳定的持久化存储、稳定的网络标志、有序部署,有序扩展,有序收缩,有序删除。

8、DaemonSet 确保全部(或者一些)Node 上运行一个 pod 的副本。

9、一组 pod 与另一组 pod 之间通信,可以在中间加一个中间层 service,有独立的 ip 和端口,避免 pod 重启后本身的 ip 发生改变。

10、K8S 假定所有的 pod 都在一个可以直接连通的扁平的网络空间中。

11、

同一个 pod 内的多个容器之间:lo

各 pod 之间的通讯: Overlay Network(覆盖网络)

pod 与 service 之间的通讯:各节点的 iptables 规则

12、Flannel,跨主机的 pod 间的请求转发。

13、

image-20221123153916303

pod 到 service 现在一般是 lvs 了,性能更高。

14、kubeadm 安装,进程自愈?centos7,内核4.4以上的环境部署集群。

15、koolshare:软路由 router 的实现方案

16、

Q:待整理

kubectl get pod -o wide

kubectl get pod

kubectl get deployment

kubectl get rs

kubectl scale --replicas=3 deployment/xxxx

kubectl xxx --help

kubectl get svc

posted on 2023-07-13 20:40  彦承  阅读(75)  评论(0编辑  收藏  举报