Kubernetes pod的yaml详解
程序员文章站
2024-03-11 10:05:55
...
Kubernetes pod的yaml详解以及在安装Kubernetes时遇到的问题记录
#Podyaml书写规范及注释
apiVersion: v1 #版本号 必填
kind: Pod #对象选择 必填
metadata: #元数据 必填
name: string #Pod名称 必填
namespaces: string #所属命名空间,默认为default 必填
labels: #自定义标签列表
name: string #标签名称
annotations: #自定义注解列表
name: string #注解列表
spec: #Pod中容器的详细定义 必填
containers: #Pod中容器列表 必填
- name: string #容器名称 必填
image: string #镜像名称 必填
imagePullPolicy: [Always|Never|ifNotPresent] #镜像获取策略,默认为Always,Always: 每次都尝试重新下载
#Never:仅使用本地镜像
#ifNotPresent:本地有时使用本地镜像,反之下载镜像
command: [string] #容器启动时的命令列表,如不指定则使用打包镜像时的命令
args: [string] #容器启动命令参数列表
workingDir: string #容器工作目录
volumeMounts: #挂载到容器内部的存储卷配置
- name: string #存储卷名称,需要使用volumes[]部分共享存储卷名称
mountPath: string #存储卷在容器内的绝对路径
readOnly: boolean #是否为只读模式,默认为读写模式
ports: #容器需要暴露的端口列表
- name: string #端口的名称
containerPort: int #容器需要监听的端口号
hostPort: int #容器所在的主机需要监听的端口号,默认与containerPort相同,设置hostPort时,同一台宿主机无法启动第二份副本
protocal: string #端口协议,支持TCP、UDP,默认为TCP
env: #容器运行钱需要配置的环境列表
- name: string #环境变量名称
value: string #变量值
resources: #资源限制和资源请求设置
limits: #资源限制
cpu: string #cpu限制,单位为core数
memory: string #内存限制,单位可为MiB/GiB等
requests: #请求限制
cpu: string #cpu请求,单位为core数,启动容器时初始可用数量
memory: string #内存请求,单位可为MiB/GiB等,容器启动的初始可用数量
livenessProde: #对Pod内个容器健康检查的设置,当探测无响应几次之后,系统将自动重启该容器,可以设置的方法包括exec、httpGet、tcpSocket,对一个容器仅需设置一种
exec: #exec方式
command: [string] #指定命令或脚本
httpGet: #httpGet方式,需指定path,port
path: string
port: number
host: string
scheme: string
httpHeaders:
- name: string
value: string
tcpSocket: #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: object #设置NodeSelector表示将该Pod调度到包含这个label的node上,以key:value的格式指定
imagePullSecrets: #Pull镜像时使用的secret名称,以key:secretkey格式指定
- name: string
hostNetwork: false #是否使用主机网络模式,默认为false,如果设置为true,表示使用宿主机网络
volumes: #在该Pod上定义共享存储卷列表
- name: string #共享存储卷的名称,在一个Pod中每个存储卷定义一个名称,容器定义部分containers[].volumeMounts[].name将引用该共享存储卷的名称
#volume的类型包括:emptyDir, hostPath、gcePersistentDisk,secret,configMap等等,可以定义多个volume,但每个volume名称需要保持唯一
emptyDir: {} #类型为emptyDir的存储卷,表示与Pod同生命周期的一个临时目录,其值是一个空对象:emptyDir{}
hostPath: #类型为hostPath的存储卷,表示挂载Pod所在的宿主机目录
path: string #Pod所定义的主机目录,将被用于容器中mount的目录
secret: #类型为secret的存储卷,表示挂载集群预定义的secret对象到容器目录
secretName: string
items:
- key: string
path: string
configMap: #类型为configMap的存储卷,挂载预定义的configMap对象到容器内部
name: string
items:
- key: string
path: string
#Service书写规范及注释
apiVersion: v1 #api-version版本,必填
kind: Service #对象选择,必填
metadata: #元数据,必填
name: String #Service名称,必填
labels: #自定义标签
name: String #标签名称
spec: #Service详细定义
clusterIP: 10.254.109.210 #k8s集群ip,本IP为虚拟ip,只限于在集群内部使用
type: NodePort #node节点端口方式映射服务ip
selector: #Pod标签选择
app: String #选择某app的名称的Pod
ports: #端口列表
- port: 80 #Service端口
targetPort: 3000 #转发到后台Pod的端口
nodePort: 32817 #映射到node上的端口
protocol: TCP #传输协议:TCP/UDP, 默认为TCP
#k8s使用:
#搭建k8s集群所需的镜像均需访问国外网站,部分镜像已重新打包放在阿里云镜像仓库服务中
1. #添加docker仓库认证凭证
#kubectl create secret docker-registry aliyun-registry --docker-server=registry.cn-shenzhen.aliyuncs.com --docker-username=****** --docker-password=******
#podName.yaml 中: imagePullSecrets:
# name: aliyun-registry
2. #创建弹性伸缩器,需安装metrics-server插件,否则无法获取pod及node的资源数据
#kubectl autoscale delpoyment rails-web --max=10 --min=3 --cpu-percent=50 当cpu的占有率超过50%时,为rails-web这个deployment创建一个副本最大为10,最小为3的副本,使其cpu保持在50%左右
3. #在安装metrics-server插件时,需要注意以下内容:
#①:开启聚合层,因为metrics-server也是一种api,所以需要在kube-apiserver.service中添加如下参数:
# --requestheader-client-ca-file=/etc/kubernetes/cert/ca.pem
# --requestheader-allowed-names=""
# --requestheader-extra-headers-prefix="X-Remote-Extra-"
# --requestheader-group-headers=X-Remote-Group
# --requestheader-username-headers=X-Remote-User
# --proxy-client-cert-file=/etc/kubernetes/cert/metrics-server.pem
# --proxy-client-key-file=/etc/kubernetes/cert/metrics-server-key.pem
# --runtime-config=api/all=true
# 但是在实际应用过程中--requestheader-allowed-names=""这个参数应该去掉,否则会报一些奇怪的错误,如Error from server (ServiceUnavailable): the server is currently unable to handle the request等,具体原因未知
#②:更换镜像:
# image: k8s.gcr.io/metrics-server-amd64:v0.3.1 ------------------------> image: registry.cn-shenzhen.aliyuncs.com/tenmind_kubernetes/metrics-server:0.3.1
# image: k8s.gcr.io/addon-resizer:1.8.3 ------------------------------> image: registry.cn-shenzhen.aliyuncs.com/tenmind_kubernetes/addon-resizer:1.8.3
#③:更改metrics-server-deployment.yaml文件addon-resizer镜像的一些启动参数:
# - --cpu={{ base_metrics_server_cpu }} ---------------------------------> - --cpu=80m
# - --extra-cpu=0.5m -----------------------------------------------------> - --extra-cpu=8m
# - --memory={{ base_metrics_server_memory }} ------------------------------> - --memory=80Mi
# - --extra-memory={{ metrics_server_memory_per_node }}Mi ------------------> - --extra-memory=8Mi
# - --threshold=5 -----------------------------------------------------> - --threshold=5
# - --deployment=metrics-server-v0.3.1 ------------------------------------> - --deployment=metrics-server-v0.3.1
# - --container=metrics-server -------------------------------------------> - --container=metrics-server
# - --poll-period=300000 ----------------------------------------------> - --poll-period=300000
# - --estimator=exponential ----------------------------------------------> - --estimator=exponential
# - --minClusterSize={{ metrics_server_min_cluster_size }} -----------------> #- --minClusterSize={{ metrics_server_min_cluster_size }}
# 所有参数必须填充为实际的值,不然无法容器启动成功
#④:更改metrics-server-deployment.yaml文件mertics-server镜像的一些启动参数:
# - --metric-resolution=30s
# - --kubelet-port=10255
# - --deprecated-kubelet-completely-insecure=true
# ||||
# - --kubelet-insecure-tls
# - --kubelet-preferred-address-types=InternalIP,Hostname,InternalDNS,ExternalDNS,ExternalIP
# - --metric-resolution=30s
# #- --source=kubernetes.summary_api:https://kubernetes.default?kubeletHttps=true&kubeletPort=10250
# #- --kubelet-port=10250
# #- --deprecated-kubelet-completely-insecure=true
4. #kubectl 常用使用命令
#①: kubectl get pod | svc | ... 获取一些pod或者service....的状态
# 衍生使用: kubectl get pod -o wide | kubectl get pod | grep podName
#②: kubectl create -f name.yaml 创建一个或多个资源对象
#③: kuebctl delete pods podName 删除一个pod
# delete -f name.yaml 删除一个或多个资源对象
#④: kubectl replace -f name.yaml 替换一个或多个资源对象
#⑤: kubectl set image deployment/deploymentName deploymentName=registry.cn-shenzhen.aliyuncs.com/tenmind_kubernetes/dms:v1.0.12 在集群中更新一个镜像
#⑥: kubectl edit Deployment | Pod | Service Name 修改并替换资源
#⑦: kubectl rollout status deployments nginx-deployment 查看rollout状态
#⑧: kubectl rollout history deployment/nginx-deployment 检查deployment的升级历史版本
#⑨: kubectl rollout history deployment/nginx-deployment --revision=2 检查某个具体版本的信息
#⑩: kubectl rollout undo deployment/nginx-deployment 回滚到上一个版本
#11: kubectl rollout undo deployment/nginx-deployment --to-revision=2 回退到某个版本
5. #连接外部数据源:通常情况下: 数据库并不适合放在容器中: 数据库集群工作繁杂,而放在容器中更加难以维护
#k8s中的解决思路:将外部的地址转变为集群本身的服务,而应用本身只需连接jdbc服务便可以访问外部数据库,如下:
# apiVersion: v1
# kind: Endpoints #创建EndPoints资源对象
# metadata:
# name: jdbc
# subsets: #外部网络参数列表
# - addresses: #外部网络地址
# - ip: 58.16.181.25
# ports:
# - port: 3306
# protocol: TCP
# ---
# apiVersion: v1
# kind: Service
# metadata:
# name: jdbc
# spec:
# clusterIP: 10.254.150.201
# ports:
# - port: 3306
# targetPort: 3306
# protocol: TCP
# 6. pvc(PersistentVolumeClaim)创建(目前试验结果:安装nfs后创建pvc挂载nfs会导致摸个节点noready,原因未知)
# ①:安装nfs(网络文件系统),安装网址:https://www.cnblogs.com/lixiuran/p/7117000.html
# 一、安装 NFS 服务器所需的软件包:
# yum install -y nfs-utils
# 二、编辑exports文件,添加从机
# vim /etc/exports
# /home/nfs/ 192.168.248.0/24(rw,sync,fsid=0)
# 同192.168.248.0/24一个网络号的主机可以挂载NFS服务器上的/home/nfs/目录到自己的文件系统中
# rw表示可读写;sync表示同步写,fsid=0表示将/data找个目录包装成根目录
# 三、启动nfs服务
# 先为rpcbind和nfs做开机启动:(必须先启动rpcbind服务)
# systemctl enable rpcbind.service
# systemctl enable nfs-server.service
# 然后分别启动rpcbind和nfs服务:
# systemctl start rpcbind.service
# systemctl start nfs-server.service
# 确认NFS服务器启动成功:
# rpcinfo -p
# 检查 NFS 服务器是否挂载我们想共享的目录 /home/nfs/:
# exportfs -r
# #使配置生效
# exportfs
# #可以查看到已经ok
# /home/nfs 192.168.248.0/24
# 四、在从机上安装NFS 客户端
# 首先是安裝nfs,同上,然后启动rpcbind服务
# 先为rpcbind做开机启动
# systemctl enable rpcbind.service
# 然后启动rpcbind服务:
# systemctl start rpcbind.service
# 注意:客户端不需要启动nfs服务
# 检查 NFS 服务器端是否有目录共享:showmount -e nfs服务器的IP
# showmount -e 192.168.248.208
# Export list for 192.168.248.208:
# /home/nfs 192.168.248.0/24
# 在从机上使用 mount 挂载服务器端的目录/home/nfs到客户端某个目录下:
# cd /home && mkdir /nfs
# mount -t nfs 192.168.248.208:/home/nfs /home/nfs
# df -h 查看是否挂载成功。
# ②:
# 7,安装harbor镜像仓库,
# ①:安装docker-compose
# 因为harbor服务是用docker-compose编排的,所以需要先安装:
# wget https://github.com/docker/compose/releases/download/1.21.2/docker-compose-Linux-x86_64
# mv ~/docker-compose-Linux-x86_64 ./docker-compose
# chmod a+x ./docker-compose
# mv ./dokcer-compose /usr/bin/
# ②:使用openssl自签ssl证书
# openssl req -newkey rsa:4096 -nodes -sha256 -keyout ca.key -x509 -days 3650 -out ca.crt #生成ca.key、ca.crt证书,过期时间:3650天
# openssl req -newkey rsa:4096 -nodes -sha256 -keyout 192.168.2.135.key -out 192.168.2.135.csr #跳过设置密码,直接按enter
# echo subjectAltName = IP:192.168.2.135,IP:58.16.181.25 > extfile.cnf #使用ip时最好执行这条
# openssl x509 -req -days 365 -in 192.168.2.135.csr -CA ca.crt -CAkey ca.key -CAcreateserial -extfile extfile.cnf -out 192.168.2.135.crt
# ③:安装harbor(试验结果:使用https模式时映射到外网无法登陆docker-registry(原因未能查出),后使用http模式,出错原因可在挂载的目录查看log)
# 下载harbor,离线安装模式
# wget --continue https://storage.googleapis.com/harbor-releases/release-1.5.0/harbor-offline-installer-v1.5.1.tgz
# tar -xzvf harbor-offline-installer-v1.5.1.tgz
# cd harbor
# docker load -i harbor.v1.5.1.tar.gz #加载harbor所需的镜像
# 更改docker-compose.yml文件,因为harbor默认的文件挂载是在/data目录,若/磁盘空间存储不够需将/data目录更改为其他目录,注:/data/secretkey目录不能更改,试验时更改后会报错:..../data/secretkey is a directory
# 更改prepare环境检查文件
# < empty_subj = "/"
# ---
# > empty_subj = "/C=/ST=/L=/O=/CN=/"
# https模式:
# 更改harbor.cfg
# < hostname = 192.168.2.135
# ---
# > hostname = reg.mydomain.com
# 11c11
# < ui_url_protocol = https
# ---
# > ui_url_protocol = http
# 23,24c23,24
# < ssl_cert = /home/harbor/certs/192.168.2.135.crt
# < ssl_cert_key = /home/harbor/certs/192.168.2.135.ket
# ---
# > ssl_cert = /data/cert/server.crt
# > ssl_cert_key = /data/cert/server.key
# ./install.sh #安装
# 完成后https://192.168.2.135 就能访问harbor ui
# mkdir -p /etc/docker/cert.d/192.168.2.135/
# cp ca.crt /etc/docker/cert.d/192.168.2.135/
# docker login 192.168.2.135 #成功登陆
# http方式: http方式较为简单,直接安装就行了,但是需要注意docker代理的问题
# 问题描述:我们在内网192.168.2.135服务器上部署了harbor,服务为http://192.168.2.135,通过路由器把135的80端口映射到公网ip:58.16.181.25:6000上,在但是公网的服务器需要访问harbor,
# 在公网上执行docker login 58.16.181.25:6000,报错信息如下:
# Error response from daemon: Get http://58.16.181.25:6000/v2/: Get http://192.168.2.135/service/token?account=admin&client_id=docker&offline_token=true&service=harbor-registry:
# net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers) (Client.Timeout exceeded while awaiting headers)
# 该问题需要在docker.service文件中添加docker Environment
# Environment="HTTP_PROXY=58.16.181.25:6000"
# 可使用systemctl show --property Environment docker 查看docker服务的environment
# 如:systemctl show --property Environment docker
# Environment=PATH=/opt/k8s/bin:/bin:/sbin:/usr/bin:/usr/sbin HTTP_PROXY=http://58.16.181.25:6000/
上一篇: Java中ArrayList类的用法与源码完全解析
下一篇: 标签控制器的简单使用