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
查看node状态,可以发现“STATUS”下增加了信息"SchedulingDisabled":
这样,系统在次创建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
使用kubectl uncordon命令对node进行恢复调度操作:
[root@centos7:/root] # kubectl uncordon centos7-1
2.Node的扩容:
当集群资源不够时,需要购买新的服务器,然后将应用系统进行水平扩展来完成对系统的扩容。
在新node中安装docker,kubelet,kubeadm等组件。之后通过kubeadm join命令将node加入集群环境:
需要用到两个认证参数,其一Token查看Token值:
[root@centos7:/root/kubernetes/manifests/ops] # kubeadm token list
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/^.* //'
将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
master端查看Node信息,可以看到node已经加入到集群当中:
这样就可以实现集群中Node的扩容。
二、更新资源对象的Label
Label(标签)作为用户可灵活定义的对象属性,可以通过kubectl label命令对其进行增加、修改、删除。
首先,使用"--show-labels"参数查看Pod的标签:
[root@centos7:/root] # kubectl get pods --show-labels
通过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
删除一个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
三、Namespace:集群环境共享与隔离
在一个组织内部,不同的工作组使用同一个kubernetes集群环境,kubernetes通过命名空间和Context设置对不同的工作组进行区分,从而实现不同的工作组使用kubernetes服务时“互不打扰”。如下图:
假设工作组分为:开发组和运维组。开发组在集群环境中需要不断的创建、修改、删除各种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
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
使用kubectl config view命令查看已经定义的Context:
[root@centos7:/root/kubernetes/manifests/ops] # kubectl config view
注意:通过kubectl config 命令在${HOME}/.kube目录下生成一个config文件,该文件内容与kubectl config view命令查看的内容一致,所以可以手动编辑此文件定义context。
注意:该文件就是在创建集群的时候我们通过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
会发现已经创建完成,并且当前运行的环境是"ctx-dev"。所以不会影响生产运维组。
切换到生产运维组并查看Pod信息:
[root@centos7:/root/kubernetes/manifests/ops] # kubectl config use-context ctx-prod [root@centos7:/root/kubernetes/manifests/ops] # kubectl get pods
在生产运维组下不会查看到刚才在开发组下创建的pod。如果想创建redis的Pod可以执行kubectl create命令进行创建。
至此,我们为两个工作组分别设置了两个运行环境。在设置好的当前运行环境时,各工作组之间的工作将不会相互干扰,并且它们能够在同一个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
未完待续...