k8s创建资源
k8s中有两种方式可以创建资源:使用kubectl命令直接创建一、创建方式分类:命令 vs 配置文件Kubernetes 支持两种方式创建资源:1.用 kubectl 命令直接创建,比如:kubectl run httpd-app --image=reg.yunwei.edu/learn/httpd:latest --replicas=2在命令行中通过参数指定资源的属性。...
创建资源的两种方式
k8s中有两种方式可以创建资源:
- 使用kubectl命令直接创建,例如
kubectl run nginx --replicas=2
这种方式简单直观快捷,上手快,比较适合临时测试或实验。
- 通过配置文件创建
kubectl apply -f nginx.yml
这种方式提供了创建资源的模板,能够重复部署,可以像管理代码一样管理部署,比较适合正式的、跨环境的规模化部署。
理解了docker中创建容器的命令后,很好理解k8s通过命令直接创建,就不在继续说了。下面我们来看一看配置文件应该怎么写。
读懂yaml文件
我们拿部署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。
控制pod的位置
默认情况下,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的删除而重新部署
更多推荐
所有评论(0)