Kubernetes集群管理

一、Node管理

1.Node的隔离与恢复

在硬件升级、硬件维护等情况下,需要将相应的node进行隔离,暂时脱离Kubernetes集群的调度范围。kubernetes提供了一种机制,既可以将Node加入集群调度,也可以将node脱离集群调度。

创建资源配置文件,在spec部分指定unschedulable为true:

apiVersion: v1
kind: Node
metadata:
  name: centos7-1
  labels:
    kubernetes.io/hostname: centos7-1
spec:
  podCIDR: 10.244.1.0/24                                                                                                                                               
  unschedulable: true

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

[root@centos7:/root/kubernetes/manifests/ops]
# kubectl replace -f unschedule_node.yaml

Kubernetes集群管理_kubernetes

查看node状态,可以发现“STATUS”下增加了信息"SchedulingDisabled":

Kubernetes集群管理_kubernetes_02

这样,系统在次创建pod时不会在向该Node进行调度。

在不使用资源配置文件时候,也可以通过kubectl patch命令完成:

# kubectl patch nodes centos7-1 -p '{"spec":{"unschedulable":true}}'

注意:将node脱离集群调度范围时,在其运行的pod不会自动停止,需要手动停止该node上运行的pod.

同样,将某个node重新纳入集群调度范围,则需要将unschedulable设置为“false”,在执行kubectl replace 或 kubectl path命令即可恢复系统对该Node的调度。

在kubernetes中,kubectl子命令"cordon"和"uncordon"也用于实现将Node进行隔离和恢复调度操作。

如,使用kubectl cordon命令对node进行隔离调度操作:

[root@centos7:/root]
# kubectl cordon centos7-1

Kubernetes集群管理_运维_03

使用kubectl uncordon命令对node进行恢复调度操作:

[root@centos7:/root]
# kubectl uncordon centos7-1

Kubernetes集群管理_kubernetes_04
2.Node的扩容:

当集群资源不够时,需要购买新的服务器,然后将应用系统进行水平扩展来完成对系统的扩容。

在新node中安装docker,kubelet,kubeadm等组件。之后通过kubeadm join命令将node加入集群环境:

需要用到两个认证参数,其一Token查看Token值:

[root@centos7:/root/kubernetes/manifests/ops]
# kubeadm token list

Kubernetes集群管理_运维_05

Token默认有效时间为24小时,如果过期可以通过“kubeadm create token”重新生成token。

其二Kubernetes认证的SHA256加密字符串

查看认证加密字符串:

[root@centos7:/root/kubernetes/manifests/ops]
# openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'

Kubernetes集群管理_kubernetes_06

将node加入集群中:

[root@centos7-3:/root]
# kubeadm join 192.168.137.100:6443 --token kjant7.4rrc5jime71l18ic --discovery-token-ca-cert-hash sha256:ea10674978cd4bb224c7006f013e1745e87bf18059b02a507eb082baf8ffab25 --ignore-preflight-errors=Swap

Kubernetes集群管理_kubernetes_07master端查看Node信息,可以看到node已经加入到集群当中:

Kubernetes集群管理_集群_08

这样就可以实现集群中Node的扩容。

二、更新资源对象的Label

Label(标签)作为用户可灵活定义的对象属性,可以通过kubectl label命令对其进行增加、修改、删除。

首先,使用"--show-labels"参数查看Pod的标签:

[root@centos7:/root]
# kubectl get pods --show-labels

Kubernetes集群管理_kubernetes_09

通过kubectl label命令为pod"myweb-zhp7v"创建role=web标签:

[root@centos7:/root]
# kubectl label pods myweb-zhp7v role=web

查看该Pod的Label:

[root@centos7:/root]
# kubectl get pods -L role

Kubernetes集群管理_运维_10

删除一个label时,指定label的key名并与一个减号相连即可:


[root@centos7:/root]
# kubectl label pods myweb-zhp7v role-

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

[root@centos7:/root]
# kubectl label pods myweb-zhp7v app=tomcat --overwrite

Kubernetes集群管理_集群_11

三、Namespace:集群环境共享与隔离

在一个组织内部,不同的工作组使用同一个kubernetes集群环境,kubernetes通过命名空间和Context设置对不同的工作组进行区分,从而实现不同的工作组使用kubernetes服务时“互不打扰”。如下图:

Kubernetes集群管理_集群_12

假设工作组分为:开发组和运维组。开发组在集群环境中需要不断的创建、修改、删除各种pod,rc,service资源等对象,以便实现敏捷开发过程。而运维组需要严格设置资源权限以保证生产环境中的pod,rc,service处于正常的工作状态且不被误操作。

1.创建namespace

为了满足以上场景需要在集群环境中创建两个命名空间:

namespace-dev.yaml:

apiVersion: v1
kind: Namespace 
metadata:
    name: development

namespace-pro.yaml:

apiVersion: v1
kind: Namespace
metadata:
    name: production

使用kubectl create完成创建:

[root@centos7:/root/kubernetes/manifests/ops]
# kubectl create -f namespace-dev.yaml 
[root@centos7:/root/kubernetes/manifests/ops]
# kubectl create -f namespace-pro.yaml

查看系统命名空间:

[root@centos7:/root/kubernetes/manifests/ops]
# kubectl get namespaces

Kubernetes集群管理_kubernetes_13

2.定义Context(运行环境)

为两个工作组定义特定的运行环境,运行环境属于特定的命名空间。

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

[root@centos7:/root/kubernetes/manifests/ops]
# kubectl config set-cluster kubernetes --server=https://192.168.137.100:6443
[root@centos7:/root/kubernetes/manifests/ops]
# kubectl config set-context ctx-dev --namespace=development --cluster=kubernetes --user=dev
[root@centos7:/root/kubernetes/manifests/ops]
# kubectl config set-context ctx-prod --namespace=production --cluster=kubernetes --user=prod

Kubernetes集群管理_kubernetes_14

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

[root@centos7:/root/kubernetes/manifests/ops]
# kubectl config view

Kubernetes集群管理_集群_15

注意:通过kubectl config 命令在${HOME}/.kube目录下生成一个config文件,该文件内容与kubectl config view命令查看的内容一致,所以可以手动编辑此文件定义context。

Kubernetes集群管理_kubernetes_16

注意:该文件就是在创建集群的时候我们通过cp /etc/kubernetes/admin.conf  ./kube/config生成的文件,所以admin.conf是原配置文件。

3.设置工作组在特定的context环境中工作

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

将当前的运行环境设置为“ctx-dev”

[root@centos7:/root/kubernetes/manifests/ops]
# kubectl config use-context ctx-dev

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

以redis-slave RC为例创建两个pod:

redis-slave-controller.yaml

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:
            containers:
            - name: slave
              image: kubeguide/guestbook-redis-slave
              ports:
              - containerPort: 6379

执行创建:

[root@centos7:/root/kubernetes/manifests/ops]
# kubectl create -f redis-slave-controller.yaml

注意:执行创建的时候如果出现以下错误:

Error from server (Forbidden): nodes is forbidden: User "system:anonymous" cannot list resource "nodes" in API group "" at the cluster scope

可以切换回管理组,并执行以下,但是该处理方法不严谨,实际生产环境中不建议这样做,详细资料

kubectl create clusterrolebinding the-boss --user system:anonymous --clusterrole cluster-admin

查看pod信息:

[root@centos7:/root/kubernetes/manifests/ops]
# kubectl get pods

Kubernetes集群管理_集群_17

会发现已经创建完成,并且当前运行的环境是"ctx-dev"。所以不会影响生产运维组。

切换到生产运维组并查看Pod信息:


[root@centos7:/root/kubernetes/manifests/ops]
# kubectl config use-context ctx-prod
[root@centos7:/root/kubernetes/manifests/ops]
# kubectl get pods

Kubernetes集群管理_运维_18

在生产运维组下不会查看到刚才在开发组下创建的pod。如果想创建redis的Pod可以执行kubectl create命令进行创建。

Kubernetes集群管理_集群_19

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

知识点:RBAC介绍及配置 - 基于角色的访问控制。   和 Kubernetes-基于RBAC的授权

四、Kubernetes资源管理

kubernetes资源管理分为计算资源管理(compute resources)、资源配置范围管理(limit range)、服务质量管理(qos)及资源配额管理(resource quota)等几个方面。

1.计算资源管理(compute resources)

在创建pod的时候,可以为Pod中的每个docker容器设定需要使用的计算资源(cpu和内存)。

计算资源中的配置项分为两种:一种是资源请求(Resource Request),表示容器所希望分配的资源量;另外一种是资源限制(Resource Limits),Limits是容器最多使用的资源量上限。

目前kubernetes资源类型分为两种:cpu和内存,对于cpu而言,基本单位为核心数;对于内存而言基本单位为字节数。

1)pod和容器的requests和limits

pod中的每个容器都可以配置一下4个参数:

spec.container[].resources,requests.cpu

spec.container[].resources.limits.cpu

spec.container[].resources.requests.memory

spec.container[].resources.limits.memory


未完待续...