Kubernetes中的API资源对象Job;API资源对象CronJob;API资源对象Endpoint;API资源对象ConfigMap;API资源对象Secret

API资源对象Job

可以理解成一次性运行后就退出的Pod。

先来生成一个YAML文件:

kubectl create job job-demo --image=busybox  --dry-run=client  -o yaml > job-demo.yaml

vi job-demo.yaml ##编辑此配置

apiVersion: batch/v1
kind: Job
metadata:
  name: job-demo
spec:
  template:  ##模板,基于此模板来创建pod,它用来定义pod的属性,比如container
    spec:
      restartPolicy: OnFailure ##定义Pod运行失败时的策略,可以是OnFailure和Never,其中OnFailure表示失败的话需要重启容器,Never表示失败的话不重启容器,而是重新生成一个新的Pod
      containers:
      - image: busybox
        name: job-demo
        command: ["/bin/echo"]
        args: ["hellow", "world"]

创建Job

kubectl apply -f job-demo.yaml

查看Job

kubectl get job,pod

可以看到该容器运行完成后状态就变成了Completed。

对于Job,还有几个特殊字段:

  • activeDeadlineSeconds,设置 Pod 运行的超时时间。
  • backoffLimit,设置 Pod 的失败重试次数。
  • completions,Job 完成需要运行多少个 Pod,默认是 1 个。
  • parallelism,它与 completions 相关,表示允许并发运行的 Pod 数量,避免过多占用资源。

vi myjob.yaml

apiVersion: batch/v1
kind: Job
metadata:
  name: sleep-job

spec:
  activeDeadlineSeconds: 15  #15s就超时
  backoffLimit: 2 #失败重试2次就放弃
  completions: 4 #要运行4个pod,才算完成
  parallelism: 2 #允许并发运行2个pod

  template:
    spec:
      restartPolicy: Never
      containers:
      - image: busybox
        name: echo-job
        imagePullPolicy: IfNotPresent
        command:
          - sh
          - -c
          - sleep 10; echo done
创建job,并查看job情况
kubectl apply -f myjob.yaml ; kubectl get pod -w

API资源对象CronJob

CronJob简称(cj)是一种周期运行的Pod,比如有些任务需要每天执行一次,就可以使用CronJob。

先来生成一个YAML文件:

kubectl create cj cj-demo --image=busybox --schedule="" --dry-run=client -o yaml > cj-demo.yaml

vi job-demo.yaml ##编辑此配置

apiVersion: batch/v1
kind: CronJob
metadata:
  name: cj-demo

spec:
  schedule: '*/1 * * * *'
  jobTemplate:
    spec:
      template:
        spec:
          restartPolicy: OnFailure
          containers:
          - image: busybox
            name: cj-demo
            imagePullPolicy: IfNotPresent
            command: ["/bin/echo"]
            args: ["hello", "world"]

运行并查看

kubectl apply -f cj-demo.yaml
kubectl get cj
kubectl get pod

API资源对象Endpoint

Endpoint(简称ep)资源是和Service一一对应的,也就是说每一个Service都会对应一个Endpoint。

kubectl get ep
NAME         ENDPOINTS                           AGE
kubernetes   192.168.222.131:6443                3d5h
ngx-svc      10.18.235.159:80,10.18.236.173:80   21h

kubectl get svc
NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.15.0.1      <none>        443/TCP   3d5h
ngx-svc      ClusterIP   10.15.41.113   <none>        80/TCP    21h

Endpoint可以理解成Service后端对应的资源。

有时候K8s里的Pod需要访问外部资源,比如访问外部的MySQL服务,就可以定义一个对外资源的Ednpoint,然后再定义一个Service,就可以让K8s里面的其它Pod访问了。

vim testep.yaml

apiVersion: v1
kind: Endpoints
metadata:
  name: external-mysql
subsets:
  - addresses:
    - ip: 192.168.222.128
    ports:
      - port: 3306

---
apiVersion: v1
kind: Service  ##注意,该service里并不需要定义selector,只要Service name和Endpoint name保持一致即可
metadata:
  name: external-mysql
spec:
  ports:
    - port: 3306

应用YAML文件

kubectl apply -f testep.yaml

测试

kubectl get ep
kubectl get svc

API资源对象ConfigMap

ConfigMap(简称cm)用来存储配置信息,比如服务端口、运行参数、文件路径等等。

直接上示例吧:

vi mycm.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: mycm

data:
  DATABASE: 'db'
  USER: 'wp'
  PASSWORD: '123456'
  ROOT_PASSWORD: '123456'

创建cm

kubectl apply -f mycm.yaml

查看

kubectl get cm
kubectl describe cm mycm

在其它pod里引用ConfigMap

vi testpod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: testpod
  labels:
    app: testpod

spec:
  containers:
  - image: mariadb:10
    name: maria
    imagePullPolicy: IfNotPresent
    ports:
    - containerPort: 3306

    envFrom:   ##将cm里的字段全部导入该pod
    - prefix: 'MARIADB_'  ##将导入的字段名前面自动加上前缀,例如MARIADB_DATABASE, MARIADB_USER
      configMapRef:  ##定义哪个cm
        name: mycm

验证:

kubectl exec -it testpod -- bash ##进入pod,查看变量$MARIADB_DATABASE

API资源对象Secret

Secret和cm的结构和用法很类似,不过在 K8s里Secret 对象又细分出很多类,比如:

  • 访问私有镜像仓库的认证信息
  • 身份识别的凭证信息
  • HTTPS 通信的证书和私钥
  • 一般的机密信息(格式由用户自行解释)

前几种我们现在暂时用不到,所以就只使用最后一种。

YAML示例:

vi mysecret.yaml

apiVersion: v1
kind: Secret
metadata:
  name: mysecret

data:
  user: YW1pbmc=   ## echo -n "aming"|base64
  passwd: bGludXgxMjM=  ## echo -n "linux123"|base64

查看:

kubectl apply -f mysecret.yaml
kubectl get secret
kubectl describe secret mysecret

在其它pod里引用Secret

vi testpod2.yaml

apiVersion: v1
kind: Pod
metadata:
  name: testpod2

spec:
  containers:
  - image: busybox
    name: busy
    imagePullPolicy: IfNotPresent
    command: ["/bin/sleep", "300"]

    env:
      - name: USERNAME
        valueFrom:
          secretKeyRef:
            name: mysecret
            key: user
      - name: PASSWORD
        valueFrom:
          secretKeyRef:
            name: mysecret
            key: passwd

查看

kubectl exec -it testpod2 -- sh ##进去后可以 echo $PASSWORD查看变量值
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐