Kubernetes API 服务器的安全防护

创建 docker-registry Secret

kubectl create secret docker-registry mydockerhubsecret \
  --docker-username=myusername \
  --docker-password=mypassword \
  --docker-email=myemail

编写 ServiceAccount YAML 文件(sa-image-pull-secret.yaml)

apiVersion: v1
kind: ServiceAccount
metadata:
  name: image-pull-secret
imagePullSecrets:
- name: mydockerhubsecret

创建 ServiceAccount 对象

kubectl apply -f sa-image-pull-secret.yaml

编写 Pod YAML 文件(private-serviceaccount.yaml),指定 serviceAccountName 为 image-pull-secret。

ConfigMap和Secret:配置应用程序

指令 解释
ENTRYPOINT 容器启动时调用的命令
CMD 传递给 ENTRYPOINT 指定命令的参数

编写 Dockerfile

FROM busybox
ADD date.sh /date.sh
RUN chmod +x /date.sh
ENTRYPOINT ["/date.sh"]
CMD ["1"]

参数默认值为 1,在运行容器可以设置参数覆盖默认值。

构建镜像

docker build -t wangjunjian/date:args .

启动镜像

$ docker run wangjunjian/date:args
Tue Aug 3 13:08:04 UTC 2021
Tue Aug 3 13:08:05 UTC 2021

设置参数覆盖默认睡眠时间

$ docker run wangjunjian/date:args 3
Tue Aug 3 13:08:46 UTC 2021
Tue Aug 3 13:08:49 UTC 2021

覆盖默认的命令

$ docker run --entrypoint=/bin/sh wangjunjian/date:args
/ # 

少量参数的设置可以使用上面的数组表示,当参数过多时可以使用下面的方式,如果参数是数值型需要使用引号。

    args:
    - str
    - "3"

Kubernetes中的污点和容忍度

例子

dedicated=foo:PreferNoSchedule
node-role.kubernetes.io/master:NoSchedule
node.kubernetes.io/unreachable:NoExecute
node.kubernetes.io/unreachable:NoSchedule

一个 key 可以有多个 effect

  • 查看集群所有节点的污点信息
$ kubectl get nodes -o=jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.status.addresses[0].address}{"\n"}{range .spec.taints[*]}{"\t"}{.key}{"="}{.value}{":"}{.effect}{"\n"}{end}{end}'
gpu1	172.16.33.66
	node.kubernetes.io/unreachable=:NoSchedule
	node.kubernetes.io/unreachable=:NoExecute
ln1	172.16.33.157
	node-role.kubernetes.io/master=:NoSchedule
ln2	172.16.33.158
ln3	172.16.33.159
ln6	172.16.33.174
	key1=value1:NoSchedule
	key1=value1:PreferNoSchedule

Kubernetes中的Service

创建 Deployment 对象

$ kubectl apply -f kubia.yaml 
deployment.apps/kubia created
  • 使用 YAML 文件
apiVersion: v1
kind: Service
metadata:
  name: kubia
  labels:
    app: kubia
spec:
  ports:
  - port: 80
    targetPort: 8080
  selector:
    app: kubia

创建 Service 对象

$ kubectl apply -f kubia-service.yaml 
service/kubia created
  • 使用命令 kubectl expose
$ kubectl expose deployment kubia --name=kubia-http
service/kubia-http exposed

查看服务

$ kubectl get svc
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE
kubia        ClusterIP   10.109.180.140   <none>        80/TCP    11m
kubia-http   ClusterIP   10.101.40.142    <none>        80/TCP    9m57s

svc 是 Service 的缩写

基于模板创建Job

基于一个公共的模板运行多个Jobs。 你可以用这种方法来并行执行批处理任务。

查看 jobs 目录,可以看到下面的结果。

$ tree jobs
jobs
├── job-apple.yaml
├── job-banana.yaml
└── job-cherry.yaml

也可以直接创建 Job 对象

cat job.yaml.jinja2 | render_template | kubectl apply -f -

Kubernetes中的Job和CronJob

tan(π/4) = 1。所以,4*atan(1)正好就是π,也就是 3.1415926…。

apiVersion: batch/v1
kind: Job
metadata:
  name: pi
spec:
  template:
    spec:
      restartPolicy: Never
      containers:
      - name: pi
        image: alpine
        command: ["sh", "-c", "echo 'scale=6000; 4*a(1)' | bc -l"]
  • restartPolicy: Pod 内所有容器的重启策略。对于 Job 重启策略只能是 OnFailure 和 Never,默认是 Always。
    • OnFailure
    • Never
    • Always(default)

运行完成后再次查看,Pod 的状态变为 Completed,不会自动删除,方便您查看日志。

$ kubectl get all
NAME           READY   STATUS      RESTARTS   AGE
pod/pi-866nk   0/1     Completed   0          11m

NAME           COMPLETIONS   DURATION   AGE
job.batch/pi   1/1           10m        11m

查看 Job 对象的描述 $ kubectl describe job pi

Kubernetes中的DaemonSet

查看 Pod 对象

$ kubectl get pods -o wide
NAME          READY   STATUS              RESTARTS   AGE   IP           NODE   NOMINATED NODE   READINESS GATES
kubia-h48q8   1/1     Running             0          23s   10.38.0.19   ln2    <none>           <none>
kubia-tx5hz   1/1     Running             0          23s   10.34.0.10   ln6    <none>           <none>
kubia-x9479   0/1     ContainerCreating   0          23s   <none>       ln3    <none>           <none>

修改 DaemonSet 的YAML文件(kubia-ds.yaml) apiVersion: apps/v1 kind: DaemonSet metadata: name: kubia spec: selector: matchLabels: app: kubia template: metadata: labels: app: kubia spec: tolerations: - key: node-role.kubernetes.

Kubernetes中的ReplicationController和ReplicaSet

$ kubectl get pods
NAME          READY   STATUS              RESTARTS   AGE
kubia-j8tth   0/1     ContainerCreating   0          35s
kubia-jkt8g   1/1     Running             0          35s
$ kubectl describe rc kubia
Name:         kubia
Namespace:    kubia
Selector:     app=kubia
Labels:       app=kubia
Annotations:  Replicas:  2 current / 2 desired
Pods Status:  1 Running / 1 Waiting / 0 Succeeded / 0 Failed
Pod Template:
  Labels:  app=kubia
  Containers:
   kubia:
    Image:        wangjunjian/kubia:latest
    Port:         8080/TCP
    Host Port:    0/TCP
    Environment:  <none>
// ...

当删除 Pod 对象后,ReplicationController 会自动创建新的 Pod 对象来满足期望的副本个数。

$ kubectl delete pod kubia-jkt8g 
pod "kubia-jkt8g" deleted

Kubernetes中的标签和标签选择器

通过添加两个标签将 Pod 组织为两个维度(基于应用的横向维度和基于版本的纵向维度)

  • 更新(--overwrite
$ kubectl label pod kubia-manual-v2 app=kubia --overwrite
pod/kubia-manual-v2 labeled
$ kubectl get pods -L app,rel
NAME                    READY   STATUS    RESTARTS   AGE    APP     REL
kubia-864465c9d-744qc   1/1     Running   0          5d4h   kubia   
kubia-864465c9d-kzql7   1/1     Running   0          5d4h   kubia   
kubia-manual            1/1     Running   0          19h    kubia   
kubia-manual-v2         1/1     Running   0          22m    kubia   stable
  • 删除(key-)
$ kubectl label pod kubia-manual-v2 rel-
pod/kubia-manual-v2 labeled
$ kubectl get pods -L app,rel
NAME                    READY   STATUS    RESTARTS   AGE    APP     REL
kubia-864465c9d-744qc   1/1     Running   0          5d4h   kubia   
kubia-864465c9d-kzql7   1/1     Running   0          5d4h   kubia   
kubia-manual            1/1     Running   0          19h    kubia   
kubia-manual-v2         1/1     Running   0          26m    kubia   

命令man help info

  • man man
......
    下表显示了手册的 章节 号及其包含的手册页类型。

    1   可执行程序或 shell 命令
    2   系统调用(内核提供的函数)
    3   库调用(程序库中的函数)
    4   特殊文件(通常位于 /dev)
    5   文件格式和规范,如 /etc/passwd
    6   游戏
    7   杂项(包括宏包和规范,如 man(7),groff(7))
    8   系统管理命令(通常只针对 root 用户)
    9   内核例程 [非标准]
......
  • 查看指定章节
man 7 man
man man.7
  • 寻找所有匹配(-a, --all 寻找所有匹配的手册页)
man -a passwd
--Man-- 下一页: passwd(5) [ 查看 (return) | 跳过 (Ctrl-D) | 退出 (Ctrl-C) ]
  • 内部命令使用 help
help cd
cd --help
  • 外部命令使用 help
ls --help
info cd