k8s创建资源

创建资源的两种方式

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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值