k8s安装metric server和了解namespace【命名空间】,含k8s pod状态为ImagePullBackOff处理方法

CONTRIBUTING.md Gopkg.toml Makefile pkg vendor

[root@master kubernetes-sigs-metrics-server-d1f4f6f]# cd deploy/

[root@master deploy]# ls

1.7 1.8+ docker minikube

[root@master deploy]# cd 1.8+/

[root@master 1.8+]# ls

aggregated-metrics-reader.yaml metrics-apiservice.yaml resource-reader.yaml

auth-delegator.yaml metrics-server-deployment.yaml

auth-reader.yaml metrics-server-service.yaml

[root@master 1.8+]#

#注意,当前在这个路径

[root@master 1.8+]# pwd

/k8s/kubernetes-sigs-metrics-server-d1f4f6f/deploy/1.8+

[root@master 1.8+]#

配置文件修改

[root@master 1.8+]# pwd

/k8s/kubernetes-sigs-metrics-server-d1f4f6f/deploy/1.8+

[root@master 1.8+]#

[root@master 1.8+]# vim metrics-server-deployment.yaml

下面行号中33行imagePullPolicy的值改为IfNotPresent

#并且34-38是新增内容,复制过去即可

33 imagePullPolicy: IfNotPresent

34 command:

35 - /metrics-server

36 - --metric-resolution=30s

37 - --kubelet-insecure-tls

38 - --kubelet-preferred-address-types=InternalIP

修改完成后是这样的

[root@master 1.8+]# cat metrics-server-deployment.yaml | grep -A 6 imagePullPolicy

imagePullPolicy: IfNotPresent

command:

  • /metrics-server

  • –metric-resolution=30s

  • –kubelet-insecure-tls

  • –kubelet-preferred-address-types=InternalIP

volumeMounts:

[root@master 1.8+]#

应用修改配置

复制下面的命令即可【.是应用当前位置所有配置文件】

[root@master 1.8+]# pwd

/k8s/kubernetes-sigs-metrics-server-d1f4f6f/deploy/1.8+

[root@master 1.8+]#

[root@master 1.8+]# kubectl apply -f .

clusterrole.rbac.authorization.k8s.io/system:aggregated-metrics-reader created

Warning: rbac.authorization.k8s.io/v1beta1 ClusterRoleBinding is deprecated in v1.17+, unavailable in v1.22+; use rbac.authorization.k8s.io/v1 ClusterRoleBinding

clusterrolebinding.rbac.authorization.k8s.io/metrics-server:system:auth-delegator created

Warning: rbac.authorization.k8s.io/v1beta1 RoleBinding is deprecated in v1.17+, unavailable in v1.22+; use rbac.authorization.k8s.io/v1 RoleBinding

rolebinding.rbac.authorization.k8s.io/metrics-server-auth-reader created

Warning: apiregistration.k8s.io/v1beta1 APIService is deprecated in v1.19+, unavailable in v1.22+; use apiregistration.k8s.io/v1 APIService

apiservice.apiregistration.k8s.io/v1beta1.metrics.k8s.io created

serviceaccount/metrics-server created

deployment.apps/metrics-server created

service/metrics-server created

clusterrole.rbac.authorization.k8s.io/system:metrics-server created

clusterrolebinding.rbac.authorization.k8s.io/system:metrics-server created

[root@master 1.8+]#

配置文件重命名

不做也可,做了更规范一点,没坏处。

[root@master 1.8+]# pwd

/k8s/kubernetes-sigs-metrics-server-d1f4f6f/deploy/1.8+

[root@master 1.8+]#

[root@master 1.8+]# cd /k8s

[root@master k8s]# ls | grep kubernetes-sigs-metrics-server-d1f4f6f/

[root@master k8s]# ls | grep kubernetes-sigs-metr

kubernetes-sigs-metrics-server-d1f4f6f

[root@master k8s]#

[root@master k8s]# mv kubernetes-sigs-metrics-server-d1f4f6f/ metric

[root@master k8s]#

至此,metrics就配置完成了。

metrics服务状态查看

现在也可以看到metrics的pod状态是running的

命令:kubectl get pods -n kube-system

[root@master k8s]# kubectl get ns

NAME STATUS AGE

default Active 4d3h

kube-node-lease Active 4d3h

kube-public Active 4d3h

kube-system Active 4d3h

[root@master k8s]# kubectl get pods -n kube-system | tail -n 2

kube-scheduler-master 1/1 Running 12 4d3h

metrics-server-644c7f4f6d-xb9bz 1/1 Running 0 6m39s

[root@master k8s]#

  • api中也有这个服务

[root@master ~]# kubectl api-versions | grep me

metrics.k8s.io/v1beta1

[root@master ~]#

测试


查看node及pod监控指标

node:kubectl top nodes

pod:kubectl top pod --all-namespaces

[root@master ~]# kubectl top nodes

W0706 16:03:01.500535 125671 top_node.go:119] Using json format to get metrics. Next release will switch to protocol-buffers, switch early by passing --use-protocol-buffers flag

NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%

master 319m 7% 1976Mi 53%

node1 132m 3% 856Mi 23%

node2 141m 3% 841Mi 22%

[root@master ~]#

[root@master ~]# kubectl top pods -n kube-system

W0706 16:03:03.934225 125697 top_pod.go:140] Using json format to get metrics. Next release will switch to protocol-buffers, switch early by passing --use-protocol-buffers flag

NAME CPU(cores) MEMORY(bytes)

calico-kube-controllers-78d6f96c7b-p4svs 4m 32Mi

calico-node-cc4fc 40m 134Mi

calico-node-stdfj 40m 138Mi

calico-node-zhhz7 58m 132Mi

coredns-545d6fc579-6kb9x 3m 28Mi

coredns-545d6fc579-v74hg 3m 19Mi

etcd-master 18m 271Mi

kube-apiserver-master 66m 387Mi

kube-controller-manager-master 21m 77Mi

kube-proxy-45qgd 1m 25Mi

kube-proxy-fdhpw 1m 35Mi

kube-proxy-zf6nt 1m 25Mi

kube-scheduler-master 4m 35Mi

metrics-server-bcfb98c76-w87q9 2m 13Mi

[root@master ~]#

top精简查看

默认执行会有一堆提示,如果不想要这些提示,直接在后面加上参数:--use-protocol-buffers即可【提示中最后有参数说明的哈】

[root@master ~]# kubectl top nodes

W0706 16:45:18.630117 42684 top_node.go:119] Using json format to get metrics. Next release will switch to protocol-buffers, switch early by passing --use-protocol-buffers flag

NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%

master 317m 7% 1979Mi 53%

node1 140m 3% 849Mi 23%

node2 138m 3% 842Mi 22%

[root@master ~]#

[root@master ~]# kubectl top nodes --use-protocol-buffers

NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%

master 324m 8% 1979Mi 53%

node1 140m 3% 850Mi 23%

node2 139m 3% 841Mi 22%

[root@master ~]#

top中使用率m说明

  • 一核心会分成1000个微核心,一个微核心为1m,如下cpu(cores)中324m就表示324个微核心。

[root@master ~]# kubectl top nodes --use-protocol-buffers

NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%

master 324m 8% 1979Mi 53%

node1 140m 3% 850Mi 23%

node2 139m 3% 841Mi 22%

[root@master ~]#

  • 核心计算百分比方式,需要先知道自己有多少颗cpu,命令:lscpu,一颗cpu是1000微核心,得出总微核心以后就可以计算了,如上master使用了324m,则master的使用率为:

324/4000*100=8.1%

[root@master ~]# lscpu | grep CPU(

CPU(s): 4

  • 问题来了,你觉得nodes中已经有CPU的%了,还自己算个der?

是的,node使用率已经有了,但pod没有,所有pod都需要自己计算的,要知道m这个东西是啥才是最重要的。

[root@master ~]# kubectl top pods -n kube-system

W0706 16:53:45.335507 52024 top_pod.go:140] Using json format to get metrics. Next release will switch to protocol-buffers, switch early by passing --use-protocol-buffers flag

NAME CPU(cores) MEMORY(bytes)

calico-kube-controllers-78d6f96c7b-p4svs 4m 32Mi

calico-node-cc4fc 41m 134Mi

calico-node-stdfj 56m 137Mi

calico-node-zhhz7 55m 133Mi

coredns-545d6fc579-6kb9x 4m 27Mi

coredns-545d6fc579-v74hg 4m 20Mi

etcd-master 18m 269Mi

kube-apiserver-master 69m 383Mi

kube-controller-manager-master 20m 77Mi

kube-proxy-45qgd 1m 25Mi

kube-proxy-fdhpw 1m 34Mi

kube-proxy-zf6nt 1m 26Mi

kube-scheduler-master 4m 35Mi

metrics-server-bcfb98c76-w87q9 1m 13Mi

[root@master ~]#

top报错error处理

metrics所有服务状态都正常,但是执行top的时候,就会报如下错误

在这里插入图片描述

这是因为应用修改配置需要时间,还没配置完成了,等待一会即可【前提是保证上面的步骤没有遗漏和配置文件修改正确】。

如果等待时间漫长了依然不行【如果在VMware的虚拟机上,确定本地物理机cpu没有处于满负荷状态(资源管理器查看使用率是不是100%)】,在master节点将metric的tar包放到/root目录下重头开始一遍即可】

namespace【命名空间】

==============================================================================

说明


  • Kubernetes 支持多个虚拟集群,它们底层依赖于同一个物理集群。这些虚拟集群被称为命名空间。

  • 在一个Kubernetes集群中可以使用namespace创建多个“虚拟集群”,这些namespace之间完全隔离,但可以通过某种方式,让一个namespace中的service可以访问到其他的namespace中的服务,我们在CentOS中部署kubernetes1.6集群的时候就用到了好几个跨越namespace的服务,比如Traefik ingress和kube-systemnamespace下的service就可以为整个集群提供服务,这些都需要通过RBAC定义集群级别的角色来实现。

查看所有Namespace


  • 查看单个:kubectl get namespace 名称【一般不会这么用】

  • 查看全部

  • 方式1:kubectl get ns【缩写】

  • 方式2:kubectl get namespace【全拼,这个namespace可以在后面加s用复数形式】

[root@master ~]# kubectl get ns

NAME STATUS AGE

default Active 4d8h

kube-node-lease Active 4d8h

kube-public Active 4d8h

kube-system Active 4d8h

ns1 Active 39m

[root@master ~]# kubectl get namespaces

NAME STATUS AGE

default Active 4d8h

kube-node-lease Active 4d8h

kube-public Active 4d8h

kube-system Active 4d8h

ns1 Active 39m

[root@master ~]#

  • Kubernetes以三个初始名称空间开头:

  • default 没有其他命名空间的对象的默认命名空间.

  • kube-system系统创建的对象的命名空间.

  • kube-public此命名空间是自动创建的,并且可供所有用户(包括未经过身份验证的用户)读取.此命名空间主要用于集群使用,关联的一些资源在集群中是可见的并且可以公开读取。此命名空间的公共方面知识一个约定,但不是非要这么要求。

  • 命名空间可以分为两个阶段:

  • Active 当前命名空间正在被使用。

  • Terminating 这个Namespace正在被删除,并且不能用于新对象。

查看namespace对应的label

命令:kubectl get namespaces --show-labels

[root@master ~]# kubectl get namespaces --show-labels

NAME STATUS AGE LABELS

ccx Active 8m2s kubernetes.io/metadata.name=ccx

ccxhero Active 73s kubernetes.io/metadata.name=ccxhero,name=ccxhero

default Active 4d8h kubernetes.io/metadata.name=default

kube-node-lease Active 4d8h kubernetes.io/metadata.name=kube-node-lease

kube-public Active 4d8h kubernetes.io/metadata.name=kube-public

kube-system Active 4d8h kubernetes.io/metadata.name=kube-system

ns1 Active 60m kubernetes.io/metadata.name=ns1

查看当前默认namespace


命令:kubectl config get-contexts

结果中 NAMESPACE就是当前所处ns空间了。

root@master ~]# kubectl config get-contexts

CURRENT NAME CLUSTER AUTHINFO NAMESPACE

  •     kubernetes-admin@kubernetes   kubernetes   kubernetes-admin   default
    

[root@master ~]#

查看单个namespace的详细信息


命令:kubectl describe namespaces 名称

[root@master ~]# kubectl describe namespaces default

Name: default

Labels: kubernetes.io/metadata.name=default

Annotations:

Status: Active

No resource quota.

No LimitRange resource.

[root@master ~]# kubectl describe namespaces kube-system

Name: kube-system

Labels: kubernetes.io/metadata.name=kube-system

Annotations:

Status: Active

No resource quota.

No LimitRange resource.

[root@master ~]#

创建namespace


方式1,通过文件创建

  • 创建一个名为my-namespace.yaml【可以在任意路径创建,名称自定义,后缀固定】的新YAML文件,其中包含以下内容:

版本v1自定义,name自定义

下面这是和命令创建是一摸一样的

[root@master ~]# cat my-namespace.yaml

apiVersion: v1

kind: Namespace

metadata:

name: ccx

[root@master ~]#

  • 但通过配置文件肯定是指定labels的意义更大,创建方式如下。

[root@master ~]# cat my-namespace.yaml

{

“apiVersion”: “v1”,

“kind”: “Namespace”,

“metadata”: {

“name”: “ccxhero”,

“labels”: {

“name”: “ccxhero”

}

}

}

[root@master ~]#

[root@master ~]# kubectl create -f my-namespace.yaml

namespace/ccxhero created

[root@master ~]# kubectl get ns

NAME STATUS AGE

ccx Active 7m2s

ccxhero Active 13s

default Active 4d8h

kube-node-lease Active 4d8h

kube-public Active 4d8h

kube-system Active 4d8h

ns1 Active 59m

  • 查看其对应的labels。

[root@master ~]# kubectl get namespaces --show-labels

NAME STATUS AGE LABELS

ccx Active 8m2s kubernetes.io/metadata.name=ccx

ccxhero Active 73s kubernetes.io/metadata.name=ccxhero,name=ccxhero

default Active 4d8h kubernetes.io/metadata.name=default

kube-node-lease Active 4d8h kubernetes.io/metadata.name=kube-node-lease

kube-public Active 4d8h kubernetes.io/metadata.name=kube-public

kube-system Active 4d8h kubernetes.io/metadata.name=kube-system

ns1 Active 60m kubernetes.io/metadata.name=ns1

[root@master ~]#

  • 然后通过一条命令生成

[root@master ~]# kubectl apply -f ./my-namespace.yaml

namespace/ccx created

[root@master ~]#

[root@master ~]# kubectl get ns

NAME STATUS AGE

ccx Active 9s

default Active 4d8h

kube-node-lease Active 4d8h

kube-public Active 4d8h

kube-system Active 4d8h

方式2,通过命令创建

  • 语法:

kubectl create namespace

  • 如,现在创建一个ccx1的空间

[root@master ~]# kubectl create namespace ccx1

namespace/ccx1 created

[root@master ~]#

[root@master ~]# kubectl get ns

NAME STATUS AGE

ccx Active 2m13s

ccx1 Active 7s

default Active 4d8h

  • 可以加上一个-f参数,类似于强制创建,如:

kubectl create -f namespace ccx1

删除Namespace


  • 注:谨慎删除命名空间,删除前先执行:kubectl get pods -n 需要删除的ns,先确定里面是否有pod或已有pod是否不需要了,因为删除ns后,里面的pod会一并被删除,不可恢复。

  • 语法:

kubectl delete namespaces

  • 如,我现在删除ccx1的空间

[root@master ~]#

[root@master ~]# kubectl delete namespaces ccx1

namespace “ccx1” deleted

[root@master ~]#

[root@master ~]# kubectl get ns

NAME STATUS AGE

ccx Active 3m44s

default Active 4d8h

在指定命名空间上部署应用


说明

  • 下面这是官方英文文档,我也是翻译里面的内容,跟着做的而已。

部署流程

  • 语法

kubeclt create deployment 自定义pod名称 --image=镜像仓库名称 -n=命名空间名称 --replicas=自定义副本数

#镜像仓库查看

[root@master ~]# docker images | grep ng

nginx latest d1a364dc548d 6 weeks ago 133MB

[root@master ~]#

命名空间查看

[root@master ~]# kubectl get ns

NAME STATUS AGE

ccx Active 15h

ccxhero Active 15h

default Active 5d

kube-node-lease Active 5d

kube-public Active 5d

kube-system Active 5d

ns1 Active 16h

[root@master ~]#

#副本数

–replicas=这参数可以不要,默认是1,如果–replicas==2,则会创建2个该pod。

创建示例

  • 如,我在ccx命名空间里创建一个nginx,副本数为2的pod

创建前是空的

[root@master ~]# kubectl get pod -n ccx

No resources found in ccx namespace.

[root@master ~]#

[root@master ~]# kubectl create deployment nginx-test --image=nginx -n=ccx --replicas=2

deployment.apps/nginx-test created

[root@master ~]#

  • 创建成功后如下

因为我指定了2个副本数,所以会有2个pod生成

[root@master ~]# kubectl get pod -n ccx

NAME READY STATUS RESTARTS AGE

nginx-test-795d659f45-j9m9b 0/1 ImagePullBackOff 0 6s

nginx-test-795d659f45-txf8l 0/1 ImagePullBackOff 0 6s

[root@master ~]#

Kubernetes pod状态为ImagePullBackOff处理方法


  • 可以看到我上面创建的2个pod的STATUS状态不是Running的,而是ImagePullBackOff,下面我们开始处理该错误。

  • 流程

  • 1、查看该命名空间下pod状态为ImagePullBackOff的NAME名称

kubectl get pods -n ccx【ccx是命名空间名称】

  • 2、查看该pod的详细信息

kubectl describe pod -n ccx nginx-test-795d659f45-j9m9b【ccx后面就是通过第一步获取的NAME】

  • 如下,我创建的nginx-test就是错误的,查看流程如下

执行第二步以后就会打印所有信息,下面中会有error原因,原因各有不同,跟着报错原因做即可,因为我的是在内网环境,没有外网,没有配置镜像源,无法下载依赖,我可以手动复制下面报错中给出的网址,去一个外网上docker pull获取相关依赖镜像,导入即可,但我不想折腾,就不演示了,你只要会处理流程就行了。

如果你是机子是通外网的,最简单的方法就是配置好阿里源,执行systemctl daemon-reload,systemctl restart docker,问题就解决了【我博客docker分类中有配置阿里源的方法】

[root@master ~]# kubectl get pods -n ccx

NAME READY STATUS RESTARTS AGE

nginx-test-795d659f45-j9m9b 0/1 ImagePullBackOff 0 34m

nginx-test-795d659f45-txf8l 0/1 ImagePullBackOff 0 34m

[root@master ~]#

[root@master ~]# kubectl describe pod -n ccx nginx-test-795d659f45-j9m9b

Name: nginx-test-795d659f45-j9m9b

Namespace: ccx

Priority: 0

Node: node2/192.168.59.144

Start Time: Wed, 07 Jul 2021 09:48:15 +0800

Labels: app=nginx-test

pod-template-hash=795d659f45

Annotations: cni.projectcalico.org/podIP: 10.244.104.2/32

cni.projectcalico.org/podIPs: 10.244.104.2/32

Status: Pending

IP: 10.244.104.2

IPs:

IP: 10.244.104.2

Controlled By: ReplicaSet/nginx-test-795d659f45

Containers:

nginx:

Container ID:

Image: nginx

Image ID:

Port:

Host Port:

State: Waiting

Reason: ImagePullBackOff

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
ed, 07 Jul 2021 09:48:15 +0800

Labels: app=nginx-test

pod-template-hash=795d659f45

Annotations: cni.projectcalico.org/podIP: 10.244.104.2/32

cni.projectcalico.org/podIPs: 10.244.104.2/32

Status: Pending

IP: 10.244.104.2

IPs:

IP: 10.244.104.2

Controlled By: ReplicaSet/nginx-test-795d659f45

Containers:

nginx:

Container ID:

Image: nginx

Image ID:

Port:

Host Port:

State: Waiting

Reason: ImagePullBackOff

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

[外链图片转存中…(img-y2d31qQp-1715791277942)]

[外链图片转存中…(img-iCrd1M6b-1715791277943)]

[外链图片转存中…(img-hbbK5DF6-1715791277943)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 22
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值