带你玩转kubernetes-k8s(第55篇-Kubernetes之Kubernetes集群管理)

Node的管理

Node的隔离与恢复

在硬件升级、硬件维护等情况下,我们需要将某些Node隔离,使其脱离Kubernetes集群的调度范围。Kubernetes提供了一种机制,既可以将Node纳入调度范围,也可以将Node脱离调度范围。

创建配置文件unschedule_node.yaml,在spec部分指定unschedulable为true:

apiVersion: v1
kind: Node
metadata:
  name: k8s-node-1
  labels:
    kubernetes.io/hostname:k8s-node-1
spec:
  unschedulable: true

    通过kubectl replace 命令完成对Node状态的修改

kubectl replace -f unschedule_node.yaml

   查看Node的状态,可以观察到在Node的状态中增加了一项SchedulingDisabled:

kubectl get nodes

这样,对于后续创建的Pod,系统将不会再向该Node进行调度。

也可以不使用配置文件,直接使用kubectl patch命令完成:

kubectl patch node k8s-node-1 -p '{"spec":{"unschedulable": true}}'

需要注意的是,将某个Node脱离调度范围时,在其上运行的Pod并不会自动停止,管理员需要手动停止在该Node上运行的Pod。

同样,如果需要将某个Node重新纳入集群调度范围,则将unschedulable设置为false,再次执行kubectl replace或kubectl patch命令就能恢复系统对该Node的调度。

另外,使用kubectl的子命令cordon和uncordon也可以实现将Node进行隔离调度和恢复调度操作。

例如,使用kubectl cordon <node_name>对某个Node进行隔离调度操作:

kubectl cordon k8s-node-1

使用 kubectl uncordon <node_name>对某个Node进行恢复调度操作:

kubectl uncordon k8s-node-1

Node的扩容

在实际生产系统中经常会出现服务器容量不足的情况,这时就需要购买新的服务器,然后将应用系统进行水平扩展来完成对系统的扩容。

在Kubernetes集群中,一个新Node的加入是非常简单的。在新的Node上安装Docker、kubelet和kube-proxy服务,然后配置kubelet和kube-proxy的启动参数,将Master URL指定为当前Kubernetes集群Master的地址,最后启动这些服务。通过kubelet默认的自动注册机制,新的Node将会自动加入现有的Kubernetes集群中。

Kubernetes Master在接受了新Node的注册之后,会自动将其纳入当前集群的调度范围,之后创建容器时,就可以对新的Node进行调度了。

通过这种机制,Kubernetes实现了集群中Node的扩容。

更新资源对象的Label

Label是用户可灵活定义的对象属性,对于正在运行的资源对象,我们随时可以通过kubectl label命令进行增加、修改、删除等操作。

例如,要给已创建的Pod “redis-master-bobr0”添加一个标签role=backend:

kubectl label pod redis-master-bobr0 role=backend

查看该Pod的Label:

kubectl get pods -Lrole

删除一个Label时,只需在命令行最后指定Label的key名并与一个减号相连即可:

kubectl label pod redis-master-bobr0 role-

在修改一个Label的值时,需要加上--overwrite参数:

kubectl label pod redis-master-bobr0 role=master --overwrite

Namespace:集群环境共享与隔离

在一个组织内部,不同的工作组可以在同一个Kubernetes集群中工作,Kubernetes通过命名空间和Context的设置对不同的工作组进行区分,使得它们既可以共享同一个Kubernetes集群的服务,也能够互不干扰。

假设在我们的组织中有两个工作组:开发组和生产运维组。开发组在Kubernetes集群中需要不断创建、修改、删除各种Pod、RC、Service等资源对象,以便实现敏捷开发。生产运维组则需要使用严格的权限设置来确保生产系统中的Pod、RC、Service处于正常运行状态且不会被误操作。

创建Namespace

为了在Kubernetes集群中实现这两个分组,首先需要创建两个命名空间:

---
apiVersion: v1
kind: Namespace
metadata:
  name: development
---
apiVersion: v1
kind: Namespace
metadata:
  name: production

使用kubectl create 命令完成命名空间的创建:

kubectl create -f namespace-de-pro.yaml

查看系统中的命名空间:

kubectl get namespaces
kubectl get ns

定义Context(运行环境)

接下来,需要为这两个工作组分别定义一个 Context,即运行环境。这个运行环境将属于某个特定的命名空间。

通过kubectl config set-context命令定义Context,并将Context置于之前创建的命名空间中:

# kubectl config set-cluster kubernetes-cluster --server=https://192.168.1.128:8080
# kubectl config set-context ctx-dev --namespace=development --cluster=kubernetes-cluster --user=dev
# kubectl config set-context ctx-prod --namespace=production --cluster=kubernetes-cluster --user=prod

使用kubectl config view命令查看已定义的Context:

kubectl config view

注意,通过kubectl config命令在${HOME}/.kube目录下生成了一个名为config的文件,文件的内容为以kubectl config view命令查看到的内容。所以,也可以通过手工编辑该文件的方式来设置Context。

设置工作组在特定Context环境下工作

使用kubectl config use-context <context_name>命令设置当前运行环境。

下面的命令将把当前运行环境设置为ctx-dev:

kubectl config use-context ctx-dev

运行这个命令后,当前的运行环境被设置为开发组所需的环境。之后的所有操作都将在名为development的命名空间中完成。

现在,以redis-slave RC为例创建两个Pod:

apiVersion: v1
kind: ReplicationController
metadata:
  name: redis-slave
  labels:
    name: redis-slave
spec:
  replicas: 2
  selector: 
    name: redis-slave
  template:
    metadata:
      labels:
        name: redis-slave
    spec:
      containser:
      - name: slave
        image: kubeguide/guestbook-redis-slave
        ports:
        - containerPort: 6379

查看创建好的Pod:

kubectl get pods

可以看到容器被正确创建并运行起来了。而且,由于当前运行环境是ctx-dev,所以不会影响生产运维组的工作。

切换到生产运维组的运行环境查看RC和Pod:

# kubectl config use-context ctx-prod
# kubectl get rc
# kubectl get pods

结果为空,说明看不到开发组创建的RC和Pod。

现在也为生产运维组创建两个redis-slave的Pod,查看创建好的Pod。可以看到容器被正确创建并运行起来了,并且当前运行环境是ctx-prod,也不会影响开发组的工作。

至此,我们为两个工作组分别设置了两个运行环境,设置好当前运行环境时,各工作组之间的工作将不会相互干扰,并且都能在同一个Kubernetes集群中同时工作。

小结:

       本节的内容到此结束,谢谢大家的浏览!

        记得自己动手做一下例子哦。有问题请在下方留言!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值