赞
踩
k8s中有两种方式可以创建资源:
kubectl run nginx --replicas=2
这种方式简单直观快捷,上手快,比较适合临时测试或实验。
kubectl apply -f nginx.yml
这种方式提供了创建资源的模板,能够重复部署,可以像管理代码一样管理部署,比较适合正式的、跨环境的规模化部署。
理解了docker中创建容器的命令后,很好理解k8s通过命令直接创建,就不在继续说了。下面我们来看一看配置文件应该怎么写。
我们拿部署bashboard的deployment时使用的yaml文件来举例,其他的controller也非常类似。
kind: Deployment apiVersion: apps/v1 metadata: labels: k8s-app: kubernetes-dashboard name: kubernetes-dashboard namespace: kube-system spec: replicas: 1 revisionHistoryLimit: 10 selector: matchLabels: k8s-app: kubernetes-dashboard template: metadata: labels: k8s-app: kubernetes-dashboard spec: containers: - name: kubernetes-dashboard image: registry.cn-hangzhou.aliyuncs.com/google_containers/kubernetes-dashboard-amd64:v1.10.1 ports: - containerPort: 8443 protocol: TCP args: - --auto-generate-certificates # Uncomment the following line to manually specify Kubernetes API server Host # If not specified, Dashboard will attempt to auto discover the API server and connect # to it. Uncomment only if the default does not work. # - --apiserver-host=http://my-address:port volumeMounts: - name: kubernetes-dashboard-certs mountPath: /certs # Create on-disk volume to store exec logs - mountPath: /tmp name: tmp-volume livenessProbe: httpGet: scheme: HTTPS path: / port: 8443 initialDelaySeconds: 30 timeoutSeconds: 30 volumes: - name: kubernetes-dashboard-certs secret: secretName: kubernetes-dashboard-certs - name: tmp-volume emptyDir: {} serviceAccountName: kubernetes-dashboard # Comment the following tolerations if Dashboard must not be deployed on master tolerations: - key: node-role.kubernetes.io/master effect: NoSchedule
虽然看起来犹如天书,但是只要细细分析就能读懂它
我们都熟悉yaml文件的格式,它的每一行都类似一个键值对,抓住那些关键的键就能明白其中的信息
kind: | 要创建的资源类型,这里是deployment |
apiVersion: | 当前配置格式的版本,这里是apps/v1 |
metadata: | 指出该资源的元数据,下面必须规定name |
metadata下的label: | 设置将pod部署在指定node |
spec: | 属于spec的部分指明该deployment的规格 |
replicas: | 指明副本数量,这里是1,意味整个k8s集群只创建一个此deployment的pod |
template: | 定义pod的模板 |
template下的metadata: | 定义pod的元数据,其下至少要定义一个label |
template下的spec: | 描述pod的规格,定义pod中每一个容器的属性,至少要有name和image |
运行pod
kubectl apply -f dashboard.yaml
删除pod
kubectl delete -f dashboard.yaml
对于这个yaml文件我们可以做一些简单的修改以达到我们的目的
当然,yaml文件还可以有很多其他的项,想要精通用yaml文件在k8s中创建资源还需要多读多想多写,需要不断积累才能灵活运用。
伸缩是指在线的增加或减少pod的副本数,直接修改replicas:参数的值即可。
k8s集群默认不会将pod部署在master节点
若其中一个node故障,k8s会检测到此node不可用,将node上的pod标记为unknown,并在其他node上创建和失效node上一致的pod,使pod的数量保持不变。
当失效node恢复后,被标记为unknown的pod会被删除,已经运行的pod不会被调度回该node。
默认情况下,kube-scheduler可能会将pod调度到所有可用的node,不过有些时候我们会希望将pod部署到指定的node上,这时可以借助label。
label也是以键值对的形式写在yaml文件中的,各种资源都可以设置label,比如
给node2设置label
kubectl label node node2 a=b
查看node2的label
kubectl get nodes node2 --show-labels
NAME STATUS ROLES AGE VERSION LABELS
node2 Ready <none> 3d v1.14.2 a=b,beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node2,kubernetes.io/os=linux
是不是看到了刚才设置的label
打开yaml文件,在pod模板的spec里通过nodeSelector将此pod指定部署到a=b的node上
nodeSelector:
a: b
要删除label执行
kubectl label node node2 a-
pod并不会随着label的删除而重新部署
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。