k8s声明式创建
- kubernetes陈述式创建与声明式创建
- yaml各个字段含义
- Pod yaml文件详解
- deployment.yaml文件详解
- server.yaml文件详解
- k8s中port的区别
- 1、声明式创建pod label包含app: zhangsan
- 2、声明式创建deployment,包含3个nginx副本,label包含app: zhangsan
- 3、创建一个service,对题2中的服务暴露到集群外部,可以通过nodeIP:nodePort访问,集群内部可以通过clusterIP:9001访问
- 4、声明式部署tomcat集群
- 5、创建一个pod包含两个initContainer和一个应用容器 ,该pod依赖于A和B两个service
kubernetes陈述式创建与声明式创建
Kubernetes支持两种方式来创建和管理资源:陈述式创建和声明式创建。
陈述式创建是指通过提供完整的资源配置来创建和管理资源。用户需要手动编写包含所有资源属性的配置文件,然后使用Kubernetes API将配置文件提交给Kubernetes集群。这种方式需要用户对资源的详细属性有较为全面的了解,并且需要手动处理资源的创建、更新和删除等操作。
声明式创建是指通过提供资源的期望状态来创建和管理资源。用户只需要编写包含资源的期望状态的配置文件,然后使用Kubernetes API将配置文件提交给Kubernetes集群。Kubernetes会根据用户提供的期望状态来自动创建、更新和删除资源,保持实际状态与期望状态的一致性。这种方式相对于陈述式创建更加简洁和高效,减少了用户的工作量。
声明式创建是Kubernetes的核心理念之一,它带来了很多好处。首先,声明式创建可以提高用户的生产力,用户只需要关注资源的期望状态,而不需要关注具体的创建细节。其次,声明式创建可以提供自愈能力,Kubernetes会自动检测资源的实际状态与期望状态之间的差异,并自动采取措施使它们保持一致。最后,声明式创建可以提供资源的可观察性,用户可以通过查看资源的期望状态来了解资源的状态和健康状况。
总之,Kubernetes的声明式创建是一种更加高效和可靠的资源管理方式,它使用户能够更轻松地创建和管理资源,并且能够提供自愈能力和可观察性。
yaml各个字段含义
Pod yaml文件详解
在Kubernetes中,Pod是Kubernetes的最小部署单元,是由一个或多个容器组成的,这些容器共享网络和存储资源。
Pod的YAML文件是描述Pod的配置文件。它使用YAML(Yet Another Markup Language)语法来定义Pod的各个字段。
下面详细解释Pod的YAML文件中各个字段的含义:
- apiVersion:指定使用的Kubernetes API版本。
- kind:指定对象的类型,这里是"Pod"。
- metadata:包含有关资源的元数据,如名称、标签、注释等。
- name:指定Pod的名称。
- labels:指定用于标识Pod的键值对标签。
- spec:指定Pod的规范。
- containers:指定Pod中包含的容器的列表。
- name:指定容器的名称。
- image:指定容器使用的镜像。
- ports:指定容器需要暴露的端口。
- restartPolicy:指定容器重启的策略。
- volumes:指定Pod使用的卷,用于在容器之间共享数据。
- hostNetwork:设置为true时,Pod将使用主机网络,而不是独立的网络命名空间。
- hostPath:指定Pod使用的主机路径。
- nodeSelector:指定Pod将被调度到的节点。
- affinity:指定Pod的亲和性规则。
- tolerations:指定Pod的容忍规则,用于指定Pod能够容忍哪些污点。
- resources:指定Pod使用的资源限制和请求。
- volumes:指定Pod使用的卷。
- initContainers:指定Pod中包含的初始化容器的列表。
- serviceAccountName:指定Pod使用的服务帐户。
- dnsPolicy:指定Pod使用的DNS策略。
- imagePullSecrets:指定拉取私有镜像所需的密钥。
- containers:指定Pod中包含的容器的列表。
这些字段通常被组织在一起,形成一个完整的Pod的YAML文件。通过编辑Pod的YAML文件,可以定制Pod的配置,以满足特定的部署需求。
# yaml格式的pod定义文件完整内容:
apiVersion: v1 #必选,版本号,例如v1
kind: Pod #必选,Pod
metadata: #必选,元数据
name: string #必选,Pod名称
namespace: string #必选,Pod所属的命名空间
labels: #自定义标签
- name: string #自定义标签名字
annotations: #自定义注释列表
- name: string
spec: #必选,Pod中容器的详细定义
containers: #必选,Pod中容器列表
- name: string #必选,容器名称
image: string #必选,容器的镜像名称
imagePullPolicy: [Always | Never | IfNotPresent] #获取镜像的策略 Alawys表示下载镜像 IfnotPresent表示优先使用本地镜像,否则下载镜像,Nerver表示仅使用本地镜像
command: [string] #容器的启动命令列表,如不指定,使用打包时使用的启动命令
args: [string] #容器的启动命令参数列表
workingDir: string #容器的工作目录
volumeMounts: #挂载到容器内部的存储卷配置
- name: string #引用pod定义的共享存储卷的名称,需用volumes[]部分定义的的卷名
mountPath: string #存储卷在容器内mount的绝对路径,应少于512字符
readOnly: boolean #是否为只读模式
ports: #需要暴露的端口库号列表
- name: string #端口号名称
containerPort: int #容器需要监听的端口号
hostPort: int #容器所在主机需要监听的端口号,默认与Container相同
protocol: string #端口协议,支持TCP和UDP,默认TCP
env: #容器运行前需设置的环境变量列表
- name: string #环境变量名称
value: string #环境变量的值
resources: #资源限制和请求的设置
limits: #资源限制的设置
cpu: string #Cpu的限制,单位为core数,1000m代表一个核心,100m代表0.1核心,将用于docker run --cpu-shares参数
memory: string #内存限制,单位可以为Mib/Gib,将用于docker run --memory参数
requests: #资源请求的设置
cpu: string #Cpu请求,容器启动的初始可用数量
memory: string #内存请求,容器启动的初始可用数量
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
restartPolicy: [Always | Never | OnFailure] #Pod的重启策略,Always表示一旦不管以何种方式终止运行,kubelet都将重启,OnFailure表示只有Pod以非0退出码退出才重启,Nerver表示不再重启该Pod
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的目录
secret: #类型为secret的存储卷,挂载集群与定义的secre对象到容器内部
scretname: string
items:
- key: string
path: string
configMap: #类型为configMap的存储卷,挂载预定义的configMap对象到容器内部
name: string
items:
- key: string
path: string
deployment.yaml文件详解
deployment.yaml文件是Kubernetes中用来定义Deployment资源的配置文件。以下是一个示例的deployment.yaml文件的详解:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-deployment
spec:
replicas: 3
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-container
image: my-image:1.0
ports:
- containerPort: 8080
- apiVersion: 定义了使用的Kubernetes API版本,这里使用的是apps/v1版本。
- kind: 定义了资源的类型,这里是Deployment。
- metadata: 定义了Deployment的元数据,包括名称(name)等信息。
- spec: 定义了Deployment的规格,包括副本数(replicas),选择器(selector)和模板(template)等信息。
- replicas: 指定了期望的副本数,这里是3个副本。
- selector: 指定了Deployment通过标签选择器来选择Pod的方式。这里的选择器是匹配标签为app=my-app的Pod。
- template: 定义了创建Pod的模板,包括元数据(metadata)和规格(spec)。
- labels: 定义了Pod的标签,这里的标签为app=my-app。
- containers: 定义了Pod中的容器,包括名称(name),镜像(image)和端口(ports)等信息。
- containerPort: 定义了容器监听的端口,这里是8080端口。
以上是一个简单的deployment.yaml文件的详解,它定义了一个Deployment资源,指定了副本数、选择器和模板等信息,用于创建和管理Pod。
server.yaml文件详解
server.yaml文件是一个配置文件,用于配置服务器的各种属性和行为。
以下是server.yaml文件中可能包含的一些常见配置项:
-
server_name: 指定服务器的名称或标识符。
-
server_address: 指定服务器的IP地址或域名。
-
port: 指定服务器监听的端口号。
-
ssl_certificate: 指定服务器使用的SSL证书文件路径。
-
ssl_key: 指定服务器使用的SSL私钥文件路径。
-
access_log: 指定访问日志文件的路径。
-
error_log: 指定错误日志文件的路径。
-
root: 指定服务器的根目录,即网站文件的存放路径。
-
index: 指定默认的首页文件名。
-
gzip: 指定是否启用gzip压缩。
-
proxy_pass: 指定反向代理的目标地址。
-
location: 指定不同URL路径的配置。
-
upstream: 指定负载均衡的服务器列表。
-
timeout: 指定服务器的超时时间。
-
max_body_size: 指定允许的请求体大小。
-
try_files: 指定服务器查找文件的顺序。
-
auth_basic: 指定是否启用HTTP基本身份验证。
k8s中port的区别
在Kubernetes (k8s)中,port具有不同的含义和用途。以下是port在k8s中的不同概念和区别:
-
Port:在k8s中,port用于定义服务或者Pod暴露给集群内部或外部的端口。它是一个整数值,并且是一个抽象的概念,通常用于定义访问服务或Pod的端口号。
-
NodePort:NodePort是一种服务类型,通过NodePort方式将服务暴露给集群外部。NodePort是一个范围在30000-32767之间的整数,它将集群中的某个端口映射到Pod的端口,从而使得外部可以通过访问Node的IP地址和NodePort访问到服务。
-
HostPort:HostPort是一种将Pod中的容器端口直接映射到Node主机上的端口的方式。通过使用HostPort,容器的端口将直接绑定到Node主机的物理网卡上,从而可以通过Node主机的IP地址和端口直接访问容器。需要注意的是,使用HostPort会有一些安全和网络隔离的考虑。
-
ContainerPort:在k8s中,ContainerPort是一个容器内的端口,它定义了容器内的应用程序暴露的端口号。容器中的应用程序可以通过ContainerPort进行监听,并接受来自其他容器或服务的请求。
-
TargetPort:TargetPort是一个服务端口,它指向Pod中的ContainerPort。当服务将请求转发给后端Pod时,将使用TargetPort来指定请求应该转发到Pod中的哪个ContainerPort。TargetPort和ContainerPort通常是相同的,但也可以不同,这取决于服务和Pod的具体配置。
总结:在k8s中,Port是一个抽象的概念,用于定义服务或Pod暴露的端口号。NodePort是一种服务类型,将服务暴露给集群外部。HostPort是一种将Pod中的容器端口直接映射到Node主机上的端口的方式。ContainerPort定义了容器内应用程序暴露的端口号。TargetPort指向Pod中的ContainerPort,用于指定请求转发的目标端口。
1、声明式创建pod label包含app: zhangsan
apiVersion: v1
kind: Pod
metadata:
name: httpd # Name of the Pod
namespace: default # Namespace where the Pod will be deployed
labels: # Labels to identify the Pod
app: zhangsan
spec: # Specification of the Pod
containers: # List of containers in the Pod
- name: httpd # Name of the container
image: httpd # Image to run in the container
ports: # List of ports to expose
- name: httpdport # Name of the port
containerPort: 80 # Port number exposed by the container
2、声明式创建deployment,包含3个nginx副本,label包含app: zhangsan
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-deployment
spec:
replicas: 3
selector:
matchLabels:
app: zhangsan
type: nginx-deployment
template:
metadata:
labels:
app: zhangsan
type: nginx-deployment
spec:
containers:
- name: my-container
image: nginx
ports:
- containerPort: 80
3、创建一个service,对题2中的服务暴露到集群外部,可以通过nodeIP:nodePort访问,集群内部可以通过clusterIP:9001访问
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
type: NodePort
ports:
- port: 9001
targetPort: 80
nodePort: 31111
selector:
app: zhangsan
type: nginx-deployment
kubectl apply -f nginx-service-test.yaml
4、声明式部署tomcat集群
apiVersion: apps/v1
kind: Deployment
metadata:
name: mytomcat
spec:
replicas: 3
selector:
matchLabels:
app: mytomcat
template:
metadata:
labels:
app: mytomcat
spec:
containers:
- name: mytomcat
image: tomcat:8
ports:
- containerPort: 8080
volumeMounts:
- name: yun-config
mountPath: /etc/localtime
volumes:
- name: yun-config
hostPath:
path: /usr/share/zoneinfo/Asia/Shanghai
5、创建一个pod包含两个initContainer和一个应用容器 ,该pod依赖于A和B两个service
test_init.yaml
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
labels:
app: myapp
spec:
containers:
- name: myapp-container
image: busybox:1.28
command: ['sh', '-c', 'echo The app is running! && sleep 3600']
initContainers:
- name: init-myservice
image: busybox:1.28
command: ['sh', '-c', 'until nslookup myservice; do echo waiting for myservice; sleep 2; done;']
- name: init-mynginx
image: busybox:1.28
command: ['sh', '-c', 'until nslookup mynginx; do echo waiting for mynginx; sleep 2; done;']
mysevice.yaml
apiVersion: v1
kind: Service
metadata:
name: myservice
spec:
type: NodePort
ports:
- port: 80
targetPort: 80
kubectl apply -f myservice.yaml
mynginx.yaml
apiVersion: v1
kind: Service
metadata:
name: mynginx
spec:
type: NodePort
ports:
- port: 81
targetPort: 80
kubectl apply -f mynginx.yaml