「Kubernetes」- 创建和修改基础的工作负载

  CREATED BY JENKINSBOT

(1)管理Kubernetes基础的工作负载(Workloads):「部署」和「POD」;

(2)通过命令行和YAML文件,创建「部署」和「POD」;

(3)以及如何「伸缩」和「更新」部署。

4.1. Creating a Deployment Using kubectl run

使用kubectl run命令创建部署:

	# kubectl run ghost --images=ghost:0.9
	# kubectl get deployment/ghost

可以通过选项指定部署参数:–env, –port, –command, –expose, –replicas

kubectl run ghost –image=ghost:0.9 –port=2368 –expose # 在2368端口启动Ghost,并创建一个服务;

kubectl run mysql –image=mysql:5.5 –env=MYSQL_ROOT_PASSWORD=root # 使用ROOT密码启动MySQL服务;

kubectl run myshell –image=busybox –command — sh -c “sleep 135142” # 启动Busybox容器,并运行指定的命令;

4.2. Creating Objects from File Manifests

还可以通过清单文件创建:

	# kubectl create -f <manifest>

下面是一个「命名空间」的清单文件的示例:

# myns.yaml
apiVersion: v1
kind: namespace
metadata:
	name: myns

使用kubectl create -f myns.yaml命令创建该对象。

还可以使用URL来创建:kubectl create -f https://example.com/path/to/foo.yaml

4.3. Writing a Pod Manifest from Scratch

从零编写一个「Pod」文件,Pod是一个/api/v1的对象,和其他Kubernetes对象类似,清单文件包含以下字段:

	apiVerison:指定API版本
	kind:指定对象类型
	metadata:提供对象相关的元数据
	spec:指定对象的规则

Pod的清单文件包含一组容器以及一组可选的卷,下面是一个简单的例子,只包含一个容器,不包含卷:

# mpod.yaml
apiVersion: v1
kind: pod
metadata:
  name: mPod
spec:
  containers:
  - name: mPod
    image: nginx

使用kubectl create -f mpod.yaml创建该POD。

与上述示例相比,真正的Pod的API规格要复杂得多。例如POD可以包含多个容器:

# mpod.yaml
apiVersion: v1
kind: pod
metadata:
  name: mPod
spec:
  containers:
  - name: mPod
    image: nginx
  - name: mPod
    image: nginx

「Pod」中还可以包含「卷」的定义,用于在容器中加载数据,还可以探测容器的应用程序的健康状况。

更多关于规则字段的描述,以及API对象的所有规则,可以参考「Pods」手册。

不要单独创建「Pod」,应该创建「部署」对象来监管「Pod」,它会通过另外一个ReplicaSet的对象监控「Pod」。

4.4. Launching a Deployment Using a Manifest

使用Deployment控制应用的启动和监控。

# fan.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: fancyapp
spec:
  replicas: 5
  template:
    metadata:
      labels:
        app: fancy
        env: development
      spec:
        containers:
        - name: sise
          image: demo:0.5.-
          ports:
          - containerPort: 9876
          env:
          - name: SIMPLE_SERVICE_VERSION
            value: "0.9"

可以看出,启动该应用的时候,有几件事情需要明确指定:

	* 设置Pod的数量;
	* 贴上标签,比如env=development;
	* 设置环境变量,比如SIMPLE_SERVICE_VERSION;

kubectl create -f fan.yaml

kubectl get deploy

kubectl get replicaset

kubectl get pods

!!!如果要删除副本集和监管的Pod,那么需要删除部署,即kubectl delete deployment/fancyapp。不要单独删除Pod,因为删除Pod会重建。

部署允许用户伸缩应用的规模,也可以升级和回滚到前一个版本。一般来说,对于需要多个具有相同特征的pod的无状态应用来说,这些方法非常实用。

!!!通常「部署」负责监管「Pod」和「副本集」,允许你细致地控制如何以及何时应该将该Pod升级到最新的版本,或者回滚到之前的版本。在某些特殊情况下爱,比如需要调试某个Pod,可以在部署的不同版本之间切换!!!

!!!「副本集」将取代「副本控制器」,二者的区别是「副本集」支持以集合为基础的标签与查询,但是以后「副本集」可能会有更多的新功能加入,将淘汰「副本控制器」!!!

可以使用kubectl create命令及–dry-run选项生成清单文件。可以先生成YAML或JOSN格式的清单文件,方便以后使用:

	# kubectl create deployment fancyapp --image nginx -o json --dry-run

关于「部署」可以参考「Deployments」手册。

4.5. Updating a Deployment

如何将「部署」更新到新版本的程序?

只需要更新部署:

	# kubectl run sise --image=afdae/simvsaf:0.4.0
	# kubectl set image deployment sise --image=afdae/simvsaf:0.4.0
	# kubectl rollout status deployment sise
	# kubectl rollout history deployment sise

如果想修改部署,可以使用kubectl edit deployment sise,该命令会在编辑器中打开部署文件,退出编辑器后自动更新部署。使用KUBE_EDITOR环境变量指定的编辑器。

使用kubectl rollout history deployment sise查看。

可以使用kubectl create--record选项指定CHANGE-CAUSE列。如果向了解什么变更触发了新版本,则可以加上此选项。

还有一些其他可以更新部署的命令:

	# kubectl apply -f foo.yaml # 更新清单文件更新部署;
	# kubectl replace -f bar.yaml # 替换部署,但替换的部署对象必须存在;
	# kubectl patch demployment sise -p '{"spec":{"template":{"spec":{"containers":[{"name":"sise", "image":"simpadfas:0.5.0"}]}}}}'

另外可以撤回操作:kubetl rollout undo deployment sise ??to?revision=2

然后使用kubectl get deployment/sise -o yaml确认回退成功。

只有POD模板(在.spec.template下的键值)的变更才会触发新的部署,例如环境变量、端口号、容易映像等等。部署方面的变更,比如副本个数,不会触发新的部署。