创建ConfigMap
apiVersion: v1 #指定版本
kind: ConfigMap #指定资源种类
metadata:
name: course-conf #名称
namespace: online #属于命名空间
data:
ADDR: <your >
DATABASE: <database name>
PASSWORD: <password>
USERNAME: <username>
#配置需要的环境变量
#修改configmap 不会更新引用
#修改注解强制触发滚动更新
$ kubectl patch deployment <deployment.name> -n <namespace.name> --patch '{"spec": {"template":{"metadata": {"annotations": {"version/config": "20211111" }}}}}'
创建Deployment
apiVersion: v1 #指定api版本,此值必须在kubectl apiversion中
kind: Namespace #指定创建资源的种类- 命名空间
metadata: #资源的元数据
name: online #名字 添加一个名为online 的命名空间
---
apiVersion: apps/v1
kind: Deployment #创建Deployment
metadata:
name: course # 资源名称,同一个namespace中唯一
namespace: online #资源属于哪个命名空间
labels: #设定资源标签
app: course
spec: #指定资源内容
replicas: 2 #你可以通过设置 .spec.replicas 来指定要同时运行的 Pod 个数,如果你没有指定 .spec.replicas, 那么默认值为 1
selector:
matchLabels:
app: course
version: v1
#selector 字段定义 Deployment 如何查找要管理的 Pods. 在这里,你选择在 Pod 模板中定义的标签(app: course)。不过,更复杂的选择规则是也可能的,只要 Pod 模板本身满足所给规则即可
template:
metadata:
labels:
app: course
version: v1
spec:
containers:
- name: course
image: <private.registry>
envFrom: #环境变量来源预先设定的configMap.name
- configMapRef:
name: course-conf
resources: #资源管理
limits: #资源限制
cpu: 200m #CPU资源(核数),两种方式,浮点数或者是整数+m,0.1=100m,最少值为0.001核(1m)
memory: 300Mi ##内存使用量
requests: #容器运行时,最低资源需求,也就是说最少需要多少资源容器才能正常运行
cpu: 50m
memory: 70Mi
imagePullPolicy: IfNotPresent
restartPolicy: Always
#三个选择Always、Never、IfNotPresent,每次启动时检查和更新(从registery)images的策略
#Always,每次都检查
#Never,每次都不检查(不管本地是否有)
#IfNotPresent,如果本地有就不检查,如果没有就拉取
#使用本地镜像需要满足两个条件:
#1 - imagePullPolicy设置为IfNotPresent(如果本地没有,才从远程仓库拉取) 或者 Never(只从本地拉取)
#2 - 从节点上要有这个镜像。准确的说是调度到哪个节点,那个节点上就要有这个镜像,否则会报错ErrImageNeverPull
imagePullSecrets: #定义pull镜像时使用secret名称
- name: regcred
#template 字段包含以下子字段:
#Pod 被使用 `labels` 字段打上 `app: course` 标签。
#Pod模板规约(即 .template.spec字段)指示Pods运行一个容器镜像
# 建一个容器并使用 `name` 字段将其命名为 `course`。
$ kubectl apply -f <deployment.yaml>
暴露服务
apiVersion: v1
kind: Service
metadata:
name: course
spec:
selector:
app: course
type: LoadBalancer
ports:
- name: grpc
protocol: TCP
port: 8000
targetPort: 50006
#apiVersion: 指定版本
#kind: 类型
#name: 指定服务名称
#labels: 标签
#port: Service 服务暴露的端口
#targetPort: 容器暴露的端口
#seletor: 关联的Pod的标签
#type:LoadBalanncer 外部负载均衡器
$ kubectl apply -f <service.yaml>
$ kubectl get svc -A
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
course LoadBalancer 10.10.10.187 10.22.2.201 8000:32125/TCP 16h
#如果是http服务则直接访问 http://EXTERNAL-IP:8000即可
#本服务是设定grpc服务,grpc client 中访问EXTERNAL-IP:8000
创建服务时,你可以选择自动创建云网络负载均衡器。这提供了一个外部可访问的 IP 地址, 可将流量分配 到集群节点上的正确端口上 ( 假设集群在支持的环境中运行,并配置了正确的云负载平衡器提供商包)。
如果不是云平台提供的服务则不可用 LoadBalanncer。可下载MetalLB提供外部可访问IP