学习资料
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组件介绍
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
:指定要对一个或多个资源执行的操作,例如create
、get
、describe
、delete
。
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的仓库。
下载方式:搜索框中输入想要查找的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、
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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?