我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Kubernetes集群插件怎么部署

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Kubernetes集群插件怎么部署

这篇文章主要介绍“Kubernetes集群插件怎么部署”,在日常操作中,相信很多人在Kubernetes集群插件怎么部署问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Kubernetes集群插件怎么部署”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

Kubernetes集群插件

插件是Kubernetes集群的附件组件,丰富和完善了集群的功能,这里分别介绍的插件有coredns、Dashboard、Metrics Server,需要注意的是:kuberntes 自带插件的 manifests yaml 文件使用 gcr.io 的 docker registry,国内被墙,需要手动替换为其它registry 地址或提前在FQ服务器上下载,然后再同步到对应的k8s部署机器上。

1 - Kubernetes集群插件 - coredns

可以从微软中国提供的 gcr.io 免费代理下载被墙的镜像;下面部署命令均在k8s-master01节点上执行。

1)修改配置文件将下载的 kubernetes-server-linux-amd64.tar.gz 解压后,再解压其中的 kubernetes-class="lazy" data-src.tar.gz 文件。[root@k8s-master01 ~]# cd /opt/k8s/work/kubernetes[root@k8s-master01 kubernetes]# tar -xzvf kubernetes-class="lazy" data-src.tar.gz解压之后,coredns 目录是 cluster/addons/dns。[root@k8s-master01 kubernetes]# cd /opt/k8s/work/kubernetes/cluster/addons/dns/coredns[root@k8s-master01 coredns]# cp coredns.yaml.base coredns.yaml[root@k8s-master01 coredns]# source /opt/k8s/bin/environment.sh[root@k8s-master01 coredns]# sed -i -e "s/__PILLAR__DNS__DOMAIN__/${CLUSTER_DNS_DOMAIN}/" -e "s/__PILLAR__DNS__SERVER__/${CLUSTER_DNS_SVC_IP}/" coredns.yaml2)创建 coredns[root@k8s-master01 coredns]# fgrep "image" ./*./coredns.yaml:        image: k8s.gcr.io/coredns:1.3.1./coredns.yaml:        imagePullPolicy: IfNotPresent./coredns.yaml.base:        image: k8s.gcr.io/coredns:1.3.1./coredns.yaml.base:        imagePullPolicy: IfNotPresent./coredns.yaml.in:        image: k8s.gcr.io/coredns:1.3.1./coredns.yaml.in:        imagePullPolicy: IfNotPresent./coredns.yaml.sed:        image: k8s.gcr.io/coredns:1.3.1./coredns.yaml.sed:        imagePullPolicy: IfNotPresent提前FQ下载"k8s.gcr.io/coredns:1.3.1"镜像,然后上传到node节点上, 执行"docker load ..."命令导入到node节点的images镜像里面或者从微软中国提供的gcr.io免费代理下载被墙的镜像,然后在修改yaml文件里更新coredns的镜像下载地址然后确保对应yaml文件里的镜像拉取策略为IfNotPresent,即本地有则使用本地镜像,不拉取接着再次进行coredns的创建[root@k8s-master01 coredns]# kubectl create -f coredns.yaml3)检查coredns功能 (执行下面命令后,稍微等一会儿,确保READY状态都是可用的)[root@k8s-master01 coredns]# kubectl get all -n kube-systemNAME                           READY   STATUS    RESTARTS   AGEpod/coredns-5b969f4c88-pd5js   1/1     Running   0          55sNAME               TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)                  AGEservice/kube-dns   ClusterIP   10.254.0.2   <none>        53/UDP,53/TCP,9153/TCP   56sNAME                      READY   UP-TO-DATE   AVAILABLE   AGEdeployment.apps/coredns   1/1     1            1           57sNAME                                 DESIRED   CURRENT   READY   AGEreplicaset.apps/coredns-5b969f4c88   1         1         1       56s查看创建的coredns的pod状态,确保没有报错[root@k8s-master01 coredns]# kubectl describe pod/coredns-5b969f4c88-pd5js -n kube-system..........................Events:  Type    Reason     Age    From                 Message  ----    ------     ----   ----                 -------  Normal  Scheduled  2m12s  default-scheduler    Successfully assigned kube-system/coredns-5b969f4c88-pd5js to k8s-node03  Normal  Pulled     2m11s  kubelet, k8s-node03  Container image "k8s.gcr.io/coredns:1.3.1" already present on machine  Normal  Created    2m10s  kubelet, k8s-node03  Created container coredns  Normal  Started    2m10s  kubelet, k8s-node03  Started container coredns4)新建一个 Deployment[root@k8s-master01 coredns]# cd /opt/k8s/work[root@k8s-master01 work]# cat > my-nginx.yaml <<EOFapiVersion: extensions/v1beta1kind: Deploymentmetadata:  name: my-nginxspec:  replicas: 2  template:    metadata:      labels:        run: my-nginx    spec:      containers:      - name: my-nginx        image: nginx:1.7.9        ports:        - containerPort: 80EOF接着执行这个Deployment的创建[root@k8s-master01 work]# kubectl create -f my-nginx.yamlexport 该 Deployment, 生成 my-nginx 服务:[root@k8s-master01 work]# kubectl expose deploy my-nginx[root@k8s-master01 work]# kubectl get services --all-namespaces |grep my-nginxdefault       my-nginx     ClusterIP   10.254.170.246   <none>        80/TCP                   19s创建另一个 Pod,查看 /etc/resolv.conf 是否包含 kubelet 配置的 --cluster-dns 和 --cluster-domain,是否能够将服务 my-nginx 解析到上面显示的 Cluster IP 10.254.170.246[root@k8s-master01 work]# cd /opt/k8s/work[root@k8s-master01 work]# cat > dnsutils-ds.yml <<EOFapiVersion: v1kind: Servicemetadata:  name: dnsutils-ds  labels:    app: dnsutils-dsspec:  type: NodePort  selector:    app: dnsutils-ds  ports:  - name: http    port: 80    targetPort: 80---apiVersion: extensions/v1beta1kind: DaemonSetmetadata:  name: dnsutils-ds  labels:    addonmanager.kubernetes.io/mode: Reconcilespec:  template:    metadata:      labels:        app: dnsutils-ds    spec:      containers:      - name: my-dnsutils        image: tutum/dnsutils:latest        command:          - sleep          - "3600"        ports:        - containerPort: 80EOF接着创建这个pod[root@k8s-master01 work]# kubectl create -f dnsutils-ds.yml查看上面创建的pod状态(需要等待一会儿,确保STATUS状态为"Running"。如果状态失败,可以执行"kubectl describe pod ...."查看原因)[root@k8s-master01 work]# kubectl get pods -lapp=dnsutils-dsNAME                READY   STATUS    RESTARTS   AGEdnsutils-ds-5sc4z   1/1     Running   0          52sdnsutils-ds-h646r   1/1     Running   0          52sdnsutils-ds-jx5kx   1/1     Running   0          52s[root@k8s-master01 work]# kubectl get svcNAME          TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGEdnsutils-ds   NodePort    10.254.185.211   <none>        80:32767/TCP   7m14skubernetes    ClusterIP   10.254.0.1       <none>        443/TCP        7d13hmy-nginx      ClusterIP   10.254.170.246   <none>        80/TCP         9m11snginx-ds      NodePort    10.254.41.83     <none>        80:30876/TCP   27h然后验证coredns 功能。先依次登陆上面创建的dnsutils的pod里面进行验证,确保pod容器中/etc/resolv.conf里的nameserver地址为"CLUSTER_DNS_SVC_IP"变量值(即environment.sh脚本中定义的)[root@k8s-master01 work]# kubectl -it exec dnsutils-ds-5sc4z bashroot@dnsutils-ds-5sc4z:/# cat /etc/resolv.confnameserver 10.254.0.2search default.svc.cluster.local svc.cluster.local cluster.local localdomainoptions ndots:5[root@k8s-master01 work]# kubectl exec dnsutils-ds-5sc4z nslookup kubernetesServer:         10.254.0.2Address:        10.254.0.2#53Name:   kubernetes.default.svc.cluster.localAddress: 10.254.0.1[root@k8s-master01 work]# kubectl exec dnsutils-ds-5sc4z nslookup www.baidu.comServer:         10.254.0.2Address:        10.254.0.2#53Non-authoritative answer:www.baidu.com   canonical name = www.a.shifen.com.www.a.shifen.com        canonical name = www.wshifen.com.Name:   www.wshifen.comAddress: 103.235.46.39发现可以将服务 my-nginx 解析到上面它对应的 Cluster IP 10.254.170.246[root@k8s-master01 work]# kubectl exec dnsutils-ds-5sc4z nslookup my-nginxServer:         10.254.0.2Address:        10.254.0.2#53Non-authoritative answer:Name:   my-nginx.default.svc.cluster.localAddress: 10.254.170.246[root@k8s-master01 work]# kubectl exec dnsutils-ds-5sc4z nslookup kube-dns.kube-system.svc.clusterServer:         10.254.0.2Address:        10.254.0.2#53** server can't find kube-dns.kube-system.svc.cluster: NXDOMAINcommand terminated with exit code 1[root@k8s-master01 work]# kubectl exec dnsutils-ds-5sc4z nslookup kube-dns.kube-system.svcServer:         10.254.0.2Address:        10.254.0.2#53Name:   kube-dns.kube-system.svc.cluster.localAddress: 10.254.0.2[root@k8s-master01 work]# kubectl exec dnsutils-ds-5sc4z nslookup kube-dns.kube-system.svc.cluster.localServer:         10.254.0.2Address:        10.254.0.2#53Name:   kube-dns.kube-system.svc.cluster.localAddress: 10.254.0.2[root@k8s-master01 work]# kubectl exec dnsutils-ds-5sc4z nslookup kube-dns.kube-system.svc.cluster.local.Server:         10.254.0.2Address:        10.254.0.2#53Name:   kube-dns.kube-system.svc.cluster.localAddress: 10.254.0.2

2 - Kubernetes集群插件 - dashboard

可以从微软中国提供的 gcr.io 免费代理下载被墙的镜像;下面部署命令均在k8s-master01节点上执行。

1)修改配置文件将下载的 kubernetes-server-linux-amd64.tar.gz 解压后,再解压其中的 kubernetes-class="lazy" data-src.tar.gz 文件 (上面在coredns部署阶段已经解压过了)[root@k8s-master01 ~]# cd /opt/k8s/work/kubernetes/[root@k8s-master01 kubernetes]# ls -d cluster/addons/dashboardcluster/addons/dashboarddashboard 对应的目录是:cluster/addons/dashboard[root@k8s-master01 kubernetes]# cd /opt/k8s/work/kubernetes/cluster/addons/dashboard修改 service 定义,指定端口类型为 NodePort,这样外界可以通过地址 NodeIP:NodePort 访问 dashboard;[root@k8s-master01 dashboard]# vim dashboard-service.yamlapiVersion: v1kind: Servicemetadata:  name: kubernetes-dashboard  namespace: kube-system  labels:    k8s-app: kubernetes-dashboard    kubernetes.io/cluster-service: "true"    addonmanager.kubernetes.io/mode: Reconcilespec:  type: NodePort                    # 添加这一行内容  selector:    k8s-app: kubernetes-dashboard  ports:  - port: 443    targetPort: 84432) 执行所有定义文件需要提前FQ将k8s.gcr.io/kubernetes-dashboard-amd64:v1.10.1镜像下载下来,然后上传到node节点上,然后执行"docker load ......" 导入到node节点的images镜像里或者从微软中国提供的gcr.io免费代理下载被墙的镜像,然后在修改yaml文件里更新dashboard的镜像下载地址[root@k8s-master01 dashboard]# fgrep "image" ./*./dashboard-controller.yaml:        image: k8s.gcr.io/kubernetes-dashboard-amd64:v1.10.1[root@k8s-master01 dashboard]# ls *.yamldashboard-configmap.yaml  dashboard-controller.yaml  dashboard-rbac.yaml  dashboard-secret.yaml  dashboard-service.yaml[root@k8s-master01 dashboard]# kubectl apply -f  .3)查看分配的 NodePort[root@k8s-master01 dashboard]# kubectl get deployment kubernetes-dashboard  -n kube-systemNAME                   READY   UP-TO-DATE   AVAILABLE   AGEkubernetes-dashboard   1/1     1            1           48s[root@k8s-master01 dashboard]# kubectl --namespace kube-system get pods -o wideNAME                                    READY   STATUS    RESTARTS   AGE   IP            NODE         NOMINATED NODE   READINESS GATEScoredns-5b969f4c88-pd5js                1/1     Running   0          33m   172.30.72.3   k8s-node03   <none>           <none>kubernetes-dashboard-85bcf5dbf8-8s7hm   1/1     Running   0          63s   172.30.72.6   k8s-node03   <none>           <none>[root@k8s-master01 dashboard]# kubectl get services kubernetes-dashboard -n kube-systemNAME                   TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)         AGEkubernetes-dashboard   NodePort   10.254.164.208   <none>        443:30284/TCP   104s可以看出:NodePort 30284 映射到 dashboard pod 443 端口;4)查看 dashboard 支持的命令行参数[root@k8s-master01 dashboard]# kubectl exec --namespace kube-system -it kubernetes-dashboard-85bcf5dbf8-8s7hm -- /dashboard --help2019/06/25 16:54:04 Starting overwatchUsage of /dashboard:      --alsologtostderr                  log to standard error as well as files      --api-log-level string             Level of API request logging. Should be one of 'INFO|NONE|DEBUG'. Default: 'INFO'. (default "INFO")      --apiserver-host string            The address of the Kubernetes Apiserver to connect to in the format of protocol://address:port, e.g., http://localhost:8080. If not specified, the assumption is that the binary runs inside a Kubernetes cluster and local discovery is attempted.      --authentication-mode strings      Enables authentication options that will be reflected on login screen. Supported values: token, basic. Default: token.Note that basic option should only be used if apiserver has '--authorization-mode=ABAC' and '--basic-auth-file' flags set. (default [token])      --auto-generate-certificates       When set to true, Dashboard will automatically generate certificates used to serve HTTPS. Default: false.      --bind-address ip                  The IP address on which to serve the --secure-port (set to 0.0.0.0 for all interfaces). (default 0.0.0.0)      --default-cert-dir string          Directory path containing '--tls-cert-file' and '--tls-key-file' files. Used also when auto-generating certificates flag is set. (default "/certs")      --disable-settings-authorizer      When enabled, Dashboard settings page will not require user to be logged in and authorized to access settings page.      --enable-insecure-login            When enabled, Dashboard login view will also be shown when Dashboard is not served over HTTPS. Default: false.      --enable-skip-login                When enabled, the skip button on the login page will be shown. Default: false.      --heapster-host string             The address of the Heapster Apiserver to connect to in the format of protocol://address:port, e.g., http://localhost:8082. If not specified, the assumption is that the binary runs inside a Kubernetes cluster and service proxy will be used.      --insecure-bind-address ip         The IP address on which to serve the --port (set to 0.0.0.0 for all interfaces). (default 127.0.0.1)      --insecure-port int                The port to listen to for incoming HTTP requests. (default 9090)      --kubeconfig string                Path to kubeconfig file with authorization and master location information.      --log_backtrace_at traceLocation   when logging hits line file:N, emit a stack trace (default :0)      --log_dir string                   If non-empty, write log files in this directory      --logtostderr                      log to standard error instead of files      --metric-client-check-period int   Time in seconds that defines how often configured metric client health check should be run. Default: 30 seconds. (default 30)      --port int                         The secure port to listen to for incoming HTTPS requests. (default 8443)      --stderrthreshold severity         logs at or above this threshold go to stderr (default 2)      --system-banner string             When non-empty displays message to Dashboard users. Accepts simple HTML tags. Default: ''.      --system-banner-severity string    Severity of system banner. Should be one of 'INFO|WARNING|ERROR'. Default: 'INFO'. (default "INFO")      --tls-cert-file string             File containing the default x509 Certificate for HTTPS.      --tls-key-file string              File containing the default x509 private key matching --tls-cert-file.      --token-ttl int                    Expiration time (in seconds) of JWE tokens generated by dashboard. Default: 15 min. 0 - never expires (default 900)  -v, --v Level                          log level for V logs      --vmodule moduleSpec               comma-separated list of pattern=N settings for file-filtered loggingpflag: help requestedcommand terminated with exit code 25)访问dashboard从1.7版本开始,dashboard只允许通过https访问,如果使用kube proxy则必须监听localhost或127.0.0.1。对于NodePort没有这个限制,但是仅建议在开发环境中使用。对于不满足这些条件的登录访问,在登录成功后浏览器不跳转,始终停在登录界面。有三种访问dashboard的方式:-> kubernetes-dashboard 服务暴露了 NodePort,可以使用 https://NodeIP:NodePort 地址访问 dashboard;-> 通过 kube-apiserver 访问 dashboard;-> 通过 kubectl proxy 访问 dashboard:第一种方式:kubernetes-dashboard 服务暴露了NodePort端口,可以通过https://NodeIP+NodePort 来访问dashboard[root@k8s-master01 dashboard]# kubectl get services kubernetes-dashboard -n kube-systemNAME                   TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)         AGEkubernetes-dashboard   NodePort   10.254.164.208   <none>        443:30284/TCP   14m则可以通过访问https://172.16.60.244:30284,https://172.16.60.245:30284,https://172.16.60.246:30284 来打开dashboard界面第二种方式:通过 kubectl proxy 访问 dashboard启动代理(下面命令会一直在前台执行,可以选择使用tmux虚拟终端执行)[root@k8s-master01 dashboard]# kubectl proxy --address='localhost' --port=8086 --accept-hosts='^*$'Starting to serve on 127.0.0.1:8086需要注意:--address 必须为 localhost 或 127.0.0.1;需要指定 --accept-hosts 选项,否则浏览器访问 dashboard 页面时提示 “Unauthorized”;这样就可以在这个服务器的浏览器里访问 URL:http://127.0.0.1:8086/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy第三种方式:通过 kube-apiserver 访问 dashboard获取集群服务地址列表:[root@k8s-master01 dashboard]# kubectl cluster-infoKubernetes master is running at https://172.16.60.250:8443CoreDNS is running at https://172.16.60.250:8443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxykubernetes-dashboard is running at https://172.16.60.250:8443/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxyTo further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.需要注意:必须通过 kube-apiserver 的安全端口(https)访问 dashbaord,访问时浏览器需要使用自定义证书,否则会被 kube-apiserver 拒绝访问。创建和导入自定义证书的操作已经在前面"部署node工作节点"环节介绍过了,这里就略过了~~~浏览器访问 URL:https://172.16.60.250:8443/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy 即可打开dashboard界面6)创建登录 Dashboard 的 token 和 kubeconfig 配置文件dashboard 默认只支持 token 认证(不支持 client 证书认证),所以如果使用 Kubeconfig 文件,需要将 token 写入到该文件。方法一:创建登录 token[root@k8s-master01 ~]# kubectl create sa dashboard-admin -n kube-systemserviceaccount/dashboard-admin created[root@k8s-master01 ~]# kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-adminclusterrolebinding.rbac.authorization.k8s.io/dashboard-admin created[root@k8s-master01 ~]# ADMIN_SECRET=$(kubectl get secrets -n kube-system | grep dashboard-admin | awk '{print $1}')[root@k8s-master01 ~]# DASHBOARD_LOGIN_TOKEN=$(kubectl describe secret -n kube-system ${ADMIN_SECRET} | grep -E '^token' | awk '{print $2}')[root@k8s-master01 ~]# echo ${DASHBOARD_LOGIN_TOKEN}eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkYXNoYm9hcmQtYWRtaW4tdG9rZW4tcmNicnMiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGFzaGJvYXJkLWFkbWluIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiZGQ1Njg0OGUtOTc2Yi0xMWU5LTkwZDQtMDA1MDU2YWM3YzgxIiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmUtc3lzdGVtOmRhc2hib2FyZC1hZG1pbiJ9.Kwh_zhI-dA8kIfs7DRmNecS_pCXQ3B2ujS_eooR-Gvoaz29cJTzD_Z67bRDS1qlJ8oyIQjW2_m837EkUCpJ8LRiOnTMjwBPMeBPHHomDGdSmdj37UEc7YQa5AmkvVWIYiUKgTHJjgLaKlk6eH7Ihvcez3IBHWTFXlULu24mlMt9XP4J7M5fIg7I5-ctfLIbV2NsvWLwiv6JAECocbGX1w0fJTmn9LlheiDQP1ByxU_WavsFYWOYPEqdUQbqcZ7iovT1ZUVyFuGS5rxzSHm86tcK_ptEinYO1dGLjMrLRZ3tB1OAOW8_u-VnHqsNwKjbZJNUljfzCGy1YoI2xUB7V4w则可以使用上面输出的token 登录 Dashboard。方法二:创建使用 token 的 KubeConfig 文件 (推荐使用这种方式)[root@k8s-master01 ~]# source /opt/k8s/bin/environment.sh设置集群参数[root@k8s-master01 ~]# kubectl config set-cluster kubernetes \  --certificate-authority=/etc/kubernetes/cert/ca.pem \  --embed-certs=true \  --server=${KUBE_APISERVER} \  --kubeconfig=dashboard.kubeconfig设置客户端认证参数,使用上面创建的 Token[root@k8s-master01 ~]# kubectl config set-credentials dashboard_user \  --token=${DASHBOARD_LOGIN_TOKEN} \  --kubeconfig=dashboard.kubeconfig设置上下文参数[root@k8s-master01 ~]# kubectl config set-context default \  --cluster=kubernetes \  --user=dashboard_user \  --kubeconfig=dashboard.kubeconfig设置默认上下文[root@k8s-master01 ~]# kubectl config use-context default --kubeconfig=dashboard.kubeconfig将上面生成的 dashboard.kubeconfig文件拷贝到本地,然后使用这个文件登录 Dashboard。[root@k8s-master01 ~]# ll dashboard.kubeconfig-rw------- 1 root root 3025 Jun 26 01:14 dashboard.kubeconfig

Kubernetes集群插件怎么部署

Kubernetes集群插件怎么部署

Kubernetes集群插件怎么部署

这里由于缺少Heapster或metrics-server插件,当前dashboard还不能展示 Pod、Nodes 的 CPU、内存等统计数据和图表。

11.3 - 部署 metrics-server 插件

metrics-server 通过 kube-apiserver 发现所有节点,然后调用 kubelet APIs(通过 https 接口)获得各节点(Node)和 Pod 的 CPU、Memory 等资源使用情况。从 Kubernetes 1.12 开始,kubernetes 的安装脚本移除了 Heapster,从 1.13 开始完全移除了对 Heapster 的支持,Heapster 不再被维护。替代方案如下:

-> 用于支持自动扩缩容的 CPU/memory HPA metrics:metrics-server;
-> 通用的监控方案:使用第三方可以获取 Prometheus 格式监控指标的监控系统,如 Prometheus Operator;
-> 事件传输:使用第三方工具来传输、归档 kubernetes events;

从 Kubernetes 1.8 开始,资源使用指标(如容器 CPU 和内存使用率)通过 Metrics API 在 Kubernetes 中获取, metrics-server 替代了heapster。Metrics Server 实现了Resource Metrics API,Metrics Server 是集群范围资源使用数据的聚合器。 Metrics Server 从每个节点上的 Kubelet 公开的 Summary API 中采集指标信息。

在了解Metrics-Server之前,必须要事先了解下Metrics API的概念。Metrics API相比于之前的监控采集方式(hepaster)是一种新的思路,官方希望核心指标的监控应该是稳定的,版本可控的,且可以直接被用户访问(例如通过使用 kubectl top 命令),或由集群中的控制器使用(如HPA),和其他的Kubernetes APIs一样。官方废弃heapster项目,就是为了将核心资源监控作为一等公民对待,即像pod、service那样直接通过api-server或者client直接访问,不再是安装一个hepater来汇聚且由heapster单独管理。

假设每个pod和node我们收集10个指标,从k8s的1.6开始,支持5000节点,每个节点30个pod,假设采集粒度为1分钟一次,则"10 x 5000 x 30 / 60 = 25000 平均每分钟2万多个采集指标"。因为k8s的api-server将所有的数据持久化到了etcd中,显然k8s本身不能处理这种频率的采集,而且这种监控数据变化快且都是临时数据,因此需要有一个组件单独处理他们,k8s版本只存放部分在内存中,于是metric-server的概念诞生了。其实hepaster已经有暴露了api,但是用户和Kubernetes的其他组件必须通过master proxy的方式才能访问到,且heapster的接口不像api-server一样,有完整的鉴权以及client集成。

有了Metrics Server组件,也采集到了该有的数据,也暴露了api,但因为api要统一,如何将请求到api-server的/apis/metrics请求转发给Metrics Server呢,
解决方案就是:kube-aggregator,在k8s的1.7中已经完成,之前Metrics Server一直没有面世,就是耽误在了kube-aggregator这一步。

kube-aggregator(聚合api)主要提供:

-> Provide an API for registering API servers;
-> Summarize discovery information from all the servers;
-> Proxy client requests to individual servers;

Metric API的使用:

-> Metrics API 只可以查询当前的度量数据,并不保存历史数据
-> Metrics API URI 为 /apis/metrics.k8s.io/,在 k8s.io/metrics 维护
-> 必须部署 metrics-server 才能使用该 API,metrics-server 通过调用 Kubelet Summary API 获取数据

Metrics server定时从Kubelet的Summary API(类似/ap1/v1/nodes/nodename/stats/summary)采集指标信息,这些聚合过的数据将存储在内存中,且以metric-api的形式暴露出去。Metrics server复用了api-server的库来实现自己的功能,比如鉴权、版本等,为了实现将数据存放在内存中吗,去掉了默认的etcd存储,引入了内存存储(即实现Storage interface)。因为存放在内存中,因此监控数据是没有持久化的,可以通过第三方存储来拓展,这个和heapster是一致的。

Kubernetes Dashboard 还不支持 metrics-server,如果使用 metrics-server 替代 Heapster,将无法在 dashboard 中以图形展示 Pod 的内存和 CPU 情况,需要通过 Prometheus、Grafana 等监控方案来弥补。kuberntes 自带插件的 manifests yaml 文件使用 gcr.io 的 docker registry,国内被墙,需要手动替换为其它 registry 地址(本文档未替换);可以从微软中国提供的 gcr.io 免费代理下载被墙的镜像;下面部署命令均在k8s-master01节点上执行。

监控架构

Kubernetes集群插件怎么部署

1)安装 metrics-server从 github clone 源码:[root@k8s-master01 ~]# cd /opt/k8s/work/[root@k8s-master01 work]# git clone https://github.com/kubernetes-incubator/metrics-server.git[root@k8s-master01 work]# cd metrics-server/deploy/1.8+/[root@k8s-master01 1.8+]# lsaggregated-metrics-reader.yaml  auth-reader.yaml         metrics-server-deployment.yaml  resource-reader.yamlauth-delegator.yaml             metrics-apiservice.yaml  metrics-server-service.yaml修改 metrics-server-deployment.yaml 文件,为 metrics-server 添加三个命令行参数(在"imagePullPolicy"行的下面添加):[root@k8s-master01 1.8+]# cp metrics-server-deployment.yaml metrics-server-deployment.yaml.bak[root@k8s-master01 1.8+]# vim metrics-server-deployment.yaml.........        args:        - --metric-resolution=30s        - --kubelet-preferred-address-types=InternalIP,Hostname,InternalDNS,ExternalDNS,ExternalIP这里需要注意:--metric-resolution=30s:从 kubelet 采集数据的周期;--kubelet-preferred-address-types:优先使用 InternalIP 来访问 kubelet,这样可以避免节点名称没有 DNS 解析记录时,通过节点名称调用节点 kubelet API 失败的情况(未配置时默认的情况);另外:需要提前FQ将k8s.gcr.io/metrics-server-amd64:v0.3.3镜像下载下来,然后上传到node节点上,然后执行"docker load ......" 导入到node节点的images镜像里或者从微软中国提供的gcr.io免费代理下载被墙的镜像,然后在修改yaml文件里更新dashboard的镜像下载地址.[root@k8s-master01 1.8+]# fgrep "image" metrics-server-deployment.yaml      # mount in tmp so we can safely use from-scratch images and/or read-only containers        image: k8s.gcr.io/metrics-server-amd64:v0.3.3        imagePullPolicy: Always由于已经提前将相应镜像导入到各node节点的image里了,所以需要将metrics-server-deployment.yaml文件中的镜像拉取策略修改为"IfNotPresent".即:本地有则使用本地镜像,不拉取[root@k8s-master01 1.8+]# fgrep "image" metrics-server-deployment.yaml      # mount in tmp so we can safely use from-scratch images and/or read-only containers        image: k8s.gcr.io/metrics-server-amd64:v0.3.3        imagePullPolicy: IfNotPresent部署 metrics-server:[root@k8s-master01 1.8+]# kubectl create -f .2)查看运行情况[root@k8s-master01 1.8+]# kubectl -n kube-system get pods -l k8s-app=metrics-serverNAME                              READY   STATUS    RESTARTS   AGEmetrics-server-54997795d9-4cv6h   1/1     Running   0          50s[root@k8s-master01 1.8+]# kubectl get svc -n kube-system  metrics-serverNAME             TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGEmetrics-server   ClusterIP   10.254.238.208   <none>        443/TCP   65s3)metrics-server 的命令行参数 (在任意一个node节点上执行下面命令)[root@k8s-node01 ~]# docker run -it --rm k8s.gcr.io/metrics-server-amd64:v0.3.3 --help4)查看 metrics-server 输出的 metrics-> 通过 kube-apiserver 或 kubectl proxy 访问:https://172.16.60.250:8443/apis/metrics.k8s.io/v1beta1/nodeshttps://172.16.60.250:8443/apis/metrics.k8s.io/v1beta1/nodes/https://172.16.60.250:8443/apis/metrics.k8s.io/v1beta1/podshttps://172.16.60.250:8443/apis/metrics.k8s.io/v1beta1/namespace//pods/-> 直接使用 kubectl 命令访问 :# kubectl get --raw apis/metrics.k8s.io/v1beta1/nodes# kubectl get --raw apis/metrics.k8s.io/v1beta1/pods kubectl# get --raw apis/metrics.k8s.io/v1beta1/nodes/ kubectl# get --raw apis/metrics.k8s.io/v1beta1/namespace//pods/[root@k8s-master01 1.8+]# kubectl get --raw "/apis/metrics.k8s.io/v1beta1" | jq .{  "kind": "APIResourceList",  "apiVersion": "v1",  "groupVersion": "metrics.k8s.io/v1beta1",  "resources": [    {      "name": "nodes",      "singularName": "",      "namespaced": false,      "kind": "NodeMetrics",      "verbs": [        "get",        "list"      ]    },    {      "name": "pods",      "singularName": "",      "namespaced": true,      "kind": "PodMetrics",      "verbs": [        "get",        "list"      ]    }  ]}[root@k8s-master01 1.8+]# kubectl get --raw "/apis/metrics.k8s.io/v1beta1/nodes" | jq .{  "kind": "NodeMetricsList",  "apiVersion": "metrics.k8s.io/v1beta1",  "metadata": {    "selfLink": "/apis/metrics.k8s.io/v1beta1/nodes"  },  "items": [    {      "metadata": {        "name": "k8s-node01",        "selfLink": "/apis/metrics.k8s.io/v1beta1/nodes/k8s-node01",        "creationTimestamp": "2019-06-27T17:11:43Z"      },      "timestamp": "2019-06-27T17:11:36Z",      "window": "30s",      "usage": {        "cpu": "47615396n",        "memory": "2413536Ki"      }    },    {      "metadata": {        "name": "k8s-node02",        "selfLink": "/apis/metrics.k8s.io/v1beta1/nodes/k8s-node02",        "creationTimestamp": "2019-06-27T17:11:43Z"      },      "timestamp": "2019-06-27T17:11:38Z",      "window": "30s",      "usage": {        "cpu": "42000411n",        "memory": "2496152Ki"      }    },    {      "metadata": {        "name": "k8s-node03",        "selfLink": "/apis/metrics.k8s.io/v1beta1/nodes/k8s-node03",        "creationTimestamp": "2019-06-27T17:11:43Z"      },      "timestamp": "2019-06-27T17:11:40Z",      "window": "30s",      "usage": {        "cpu": "54095172n",        "memory": "3837404Ki"      }    }  ]}这里需要注意:/apis/metrics.k8s.io/v1beta1/nodes 和 /apis/metrics.k8s.io/v1beta1/pods 返回的 usage 包含 CPU 和 Memory;5)使用 kubectl top 命令查看集群节点资源使用情况[root@k8s-master01 1.8+]# kubectl top nodeNAME         CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%  k8s-node01   45m          1%     2357Mi          61%      k8s-node02   44m          1%     2437Mi          63%      k8s-node03   54m          1%     3747Mi          47%=======================================================================================================================================报错解决:[root@k8s-master01 1.8+]# kubectl top nodeError from server (Forbidden): nodes.metrics.k8s.io is forbidden: User "aggregator" cannot list resource "nodes" in API group "metrics.k8s.io" at the cluster scope出现上述错误的原因主要是未对aggregator这个sa进行rbac授权!偷懒的解决方案,直接将这个sa和cluster-admin进行绑定,但不符合最小权限原则。[root@k8s-master01 1.8+]# kubectl create clusterrolebinding  custom-metric-with-cluster-admin --clusterrole=cluster-admin --user=aggregator

Kubernetes集群插件怎么部署

Kubernetes集群插件怎么部署

11.4 - 部署 kube-state-metrics 插件

上面已经部署了metric-server,几乎容器运行的大多数指标数据都能采集到了,但是下面这种情况的指标数据的采集却无能为力:

-> 调度了多少个replicas?现在可用的有几个?
-> 多少个Pod是running/stopped/terminated状态?
-> Pod重启了多少次?
-> 当前有多少job在运行中?

这些则是kube-state-metrics提供的内容,它是K8S的一个附加服务,基于client-go开发的。它会轮询Kubernetes API,并将Kubernetes的结构化信息转换为metrics。kube-state-metrics能够采集绝大多数k8s内置资源的相关数据,例如pod、deploy、service等等。同时它也提供自己的数据,主要是资源采集个数和采集发生的异常次数统计。

kube-state-metrics 指标类别包括:

CronJob Metrics
DaemonSet Metrics
Deployment Metrics
Job Metrics
LimitRange Metrics
Node Metrics
PersistentVolume Metrics
PersistentVolumeClaim Metrics
Pod Metrics
Pod Disruption Budget Metrics
ReplicaSet Metrics
ReplicationController Metrics
ResourceQuota Metrics
Service Metrics
StatefulSet Metrics
Namespace Metrics
Horizontal Pod Autoscaler Metrics
Endpoint Metrics
Secret Metrics
ConfigMap Metrics

以pod为例的指标有:

kube_pod_info
kube_pod_owner
kube_pod_status_running
kube_pod_status_ready
kube_pod_status_scheduled
kube_pod_container_status_waiting
kube_pod_container_status_terminated_reason
..............

kube-state-metrics与metric-server (或heapster)的对比

1)metric-server是从api-server中获取cpu,内存使用率这种监控指标,并把它们发送给存储后端,如influxdb或云厂商,它当前的核心作用是:为HPA等组件提供决策指标支持。

2)kube-state-metrics关注于获取k8s各种资源的最新状态,如deployment或者daemonset,之所以没有把kube-state-metrics纳入到metric-server的能力中,是因为它们的关注点本质上是不一样的。metric-server仅仅是获取、格式化现有数据,写入特定的存储,实质上是一个监控系统。而kube-state-metrics是将k8s的运行状况在内存中做了个快照,并且获取新的指标,但它没有能力导出这些指标

3)换个角度讲,kube-state-metrics本身是metric-server的一种数据来源,虽然现在没有这么做。

4)另外,像Prometheus这种监控系统,并不会去用metric-server中的数据,它都是自己做指标收集、集成的(Prometheus包含了metric-server的能力),但Prometheus可以监控metric-server本身组件的监控状态并适时报警,这里的监控就可以通过kube-state-metrics来实现,如metric-serverpod的运行状态。

kube-state-metrics本质上是不断轮询api-server,其性能优化:

kube-state-metrics在之前的版本中暴露出两个问题:

1)/metrics接口响应慢(10-20s)
2)内存消耗太大,导致超出limit被杀掉

问题一的方案:就是基于client-go的cache tool实现本地缓存,具体结构为:var cache = map[uuid][]byte{}
问题二的的方案是:对于时间序列的字符串,是存在很多重复字符的(如namespace等前缀筛选),可以用指针或者结构化这些重复字符。

kube-state-metrics优化点和问题

1)因为kube-state-metrics是监听资源的add、delete、update事件,那么在kube-state-metrics部署之前已经运行的资源的数据是不是就拿不到了?其实kube-state-metric利用client-go可以初始化所有已经存在的资源对象,确保没有任何遗漏;

2)kube-state-metrics当前不会输出metadata信息(如help和description);

3)缓存实现是基于golang的map,解决并发读问题当期是用了一个简单的互斥锁,应该可以解决问题,后续会考虑golang的sync.Map安全map;

4)kube-state-metrics通过比较resource version来保证event的顺序;

5)kube-state-metrics并不保证包含所有资源;

下面部署命令均在k8s-master01节点上执行。

1)修改配置文件将下载的 kube-state-metrics.tar.gz 放到/opt/k8s/work目录下解压[root@k8s-master01 ~]# cd /opt/k8s/work/[root@k8s-master01 work]# tar -zvxf kube-state-metrics.tar.gz[root@k8s-master01 work]# cd kube-state-metricskube-state-metrics目录下,有所需要的文件[root@k8s-master01 kube-state-metrics]# lltotal 32-rw-rw-r-- 1 root root  362 May  6 17:31 kube-state-metrics-cluster-role-binding.yaml-rw-rw-r-- 1 root root 1076 May  6 17:31 kube-state-metrics-cluster-role.yaml-rw-rw-r-- 1 root root 1657 Jul  1 17:35 kube-state-metrics-deployment.yaml-rw-rw-r-- 1 root root  381 May  6 17:31 kube-state-metrics-role-binding.yaml-rw-rw-r-- 1 root root  508 May  6 17:31 kube-state-metrics-role.yaml-rw-rw-r-- 1 root root   98 May  6 17:31 kube-state-metrics-service-account.yaml-rw-rw-r-- 1 root root  404 May  6 17:31 kube-state-metrics-service.yaml[root@k8s-master01 kube-state-metrics]# fgrep -R "image" ./*./kube-state-metrics-deployment.yaml:        image: quay.io/coreos/kube-state-metrics:v1.5.0./kube-state-metrics-deployment.yaml:        imagePullPolicy: IfNotPresent./kube-state-metrics-deployment.yaml:        image: k8s.gcr.io/addon-resizer:1.8.3./kube-state-metrics-deployment.yaml:        imagePullPolicy: IfNotPresent[root@k8s-master01 kube-state-metrics]# cat kube-state-metrics-service.yamlapiVersion: v1kind: Servicemetadata:  name: kube-state-metrics  namespace: kube-system  labels:    k8s-app: kube-state-metrics  annotations:    prometheus.io/scrape: 'true'spec:  ports:  - name: http-metrics    port: 8080    targetPort: http-metrics    protocol: TCP  - name: telemetry    port: 8081    targetPort: telemetry    protocol: TCP  type: NodePort                                    #添加这一行  selector:    k8s-app: kube-state-metrics注意两点:其中有个是镜像是"k8s.gcr.io/addon-resizer:1.8.3"在国内因为某些原因无法拉取,可以更换为"ist0ne/addon-resizer"即可正常使用。或者通过FQ下载。service 如果需要集群外部访问,需要改为NodePort2)执行所有定义文件需要提前FQ将quay.io/coreos/kube-state-metrics:v1.5.0 和 k8s.gcr.io/addon-resizer:1.8.3镜像下载下来,然后上传到node节点上,然后执行"docker load ......" 导入到node节点的images镜像里或者从微软中国提供的gcr.io免费代理下载被墙的镜像,然后在修改yaml文件里更新dashboard的镜像下载地址。由于已经提前将相应镜像导入到各node节点的image里了,所以需要将kube-state-metrics-deployment.yaml文件中的镜像拉取策略修改为"IfNotPresent".即本地有则使用本地镜像,不拉取。[root@k8s-master01 kube-state-metrics]# kubectl create -f .执行后检查一下:[root@k8s-master01 kube-state-metrics]# kubectl get pod -n kube-system|grep kube-state-metrics     kube-state-metrics-5dd55c764d-nnsdv     2/2     Running   0          9m3s[root@k8s-master01 kube-state-metrics]# kubectl get svc -n kube-system|grep kube-state-metrics    kube-state-metrics     NodePort    10.254.228.212   <none>        8080:30978/TCP,8081:30872/TCP   9m14s[root@k8s-master01 kube-state-metrics]# kubectl get pod,svc -n kube-system|grep kube-state-metricspod/kube-state-metrics-5dd55c764d-nnsdv     2/2     Running   0          9m12sservice/kube-state-metrics     NodePort    10.254.228.212   <none>        8080:30978/TCP,8081:30872/TCP   9m18s3)验证kube-state-metrics数据采集通过上面的检查,可以得知映射到外部访问的NodePort端口是30978,通过任意一个node工作节点即可验证访问:[root@k8s-master01 kube-state-metrics]# curl http://172.16.60.244:30978/metrics|head -10  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current                                 Dload  Upload   Total   Spent    Left  Speed  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0# HELP kube_configmap_info Information about configmap.# TYPE kube_configmap_info gaugekube_configmap_info{namespace="kube-system",configmap="extension-apiserver-authentication"} 1kube_configmap_info{namespace="kube-system",configmap="coredns"} 1kube_configmap_info{namespace="kube-system",configmap="kubernetes-dashboard-settings"} 1# HELP kube_configmap_created Unix creation timestamp# TYPE kube_configmap_created gaugekube_configmap_created{namespace="kube-system",configmap="extension-apiserver-authentication"} 1.560825764e+09kube_configmap_created{namespace="kube-system",configmap="coredns"} 1.561479528e+09kube_configmap_created{namespace="kube-system",configmap="kubernetes-dashboard-settings"} 1.56148146e+09100 73353    0 73353    0     0   9.8M      0 --:--:-- --:--:-- --:--:-- 11.6Mcurl: (23) Failed writing body (0 != 2048)

Kubernetes集群插件怎么部署

Kubernetes集群插件怎么部署

5 - 部署 harbor 私有仓库

安装的话,可以参考Docker私有仓库Harbor介绍和部署方法详解,需要在两台节点机172.16.60.247、172.16.60.248上都安装harbor私有仓库环境。上层通过Nginx+Keepalived实现Harbor的负载均衡+高可用,两个Harbor相互同步(主主复制)。

harbor上远程同步的操作:

1)"仓库管理"创建目标,创建后可以测试是否正常连接目标。

2)"同步管理"创建规则,在规则中调用上面创建的目标。

3)手动同步或定时同步。

例如:已经在172.16.60.247这台harbor节点的私有仓库library和kevin_img的项目里各自存放了镜像,如下:

Kubernetes集群插件怎么部署

现在要把172.16.60.247的harbor私有仓库的这两个项目下的镜像同步到另一个节点172.16.60.248的harbor里。同步同步方式:147 -> 148 或 147 <- 148

Kubernetes集群插件怎么部署

Kubernetes集群插件怎么部署

Kubernetes集群插件怎么部署

Kubernetes集群插件怎么部署

Kubernetes集群插件怎么部署

Kubernetes集群插件怎么部署

Kubernetes集群插件怎么部署

Kubernetes集群插件怎么部署

上面是手动同步,也可以选择定时同步,分别填写的是"秒 分 时 日 月 周", 如下每两分钟同步一次!  则过了两分钟之后就会自动同步过来了~

Kubernetes集群插件怎么部署

6 - kubernetes集群管理测试

[root@k8s-master01 ~]# kubectl get csNAME                 STATUS    MESSAGE             ERRORscheduler            Healthy   ok                controller-manager   Healthy   ok                etcd-2               Healthy   {"health":"true"} etcd-0               Healthy   {"health":"true"} etcd-1               Healthy   {"health":"true"}   [root@k8s-master01 ~]# kubectl get nodesNAME         STATUS   ROLES    AGE   VERSIONk8s-node01   Ready    <none>   20d   v1.14.2k8s-node02   Ready    <none>   20d   v1.14.2k8s-node03   Ready    <none>   20d   v1.14.2  部署测试实例[root@k8s-master01 ~]# kubectl run kevin-nginx --image=nginx --replicas=3kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.deployment.apps/kevin-nginx created  [root@k8s-master01 ~]# kubectl run --generator=run-pod/v1 kevin-nginx --image=nginx --replicas=3pod/kevin-nginx created  稍等一会儿,查看创建的kevin-nginx的pod(由于创建时要自动下载nginx镜像,所以需要等待一段时间)[root@k8s-master01 ~]# kubectl get pods --all-namespaces|grep "kevin-nginx"default       kevin-nginx                             1/1     Running   0          98sdefault       kevin-nginx-569dcd559b-6h5nn            1/1     Running   0          106sdefault       kevin-nginx-569dcd559b-7f2b4            1/1     Running   0          106sdefault       kevin-nginx-569dcd559b-7tds2            1/1     Running   0          106s  查看具体详细事件[root@k8s-master01 ~]# kubectl get pods --all-namespaces -o wide|grep "kevin-nginx"default       kevin-nginx                             1/1     Running   0          2m13s   172.30.72.12   k8s-node03   <none>           <none>default       kevin-nginx-569dcd559b-6h5nn            1/1     Running   0          2m21s   172.30.56.7    k8s-node02   <none>           <none>default       kevin-nginx-569dcd559b-7f2b4            1/1     Running   0          2m21s   172.30.72.11   k8s-node03   <none>           <none>default       kevin-nginx-569dcd559b-7tds2            1/1     Running   0          2m21s   172.30.88.8    k8s-node01   <none>           <none>  [root@k8s-master01 ~]# kubectl get deployment|grep kevin-nginxkevin-nginx   3/3     3            3           2m57s  创建svc[root@k8s-master01 ~]# kubectl expose deployment kevin-nginx --port=8080 --target-port=80 --type=NodePort  [root@k8s-master01 ~]# kubectl get svc|grep kevin-nginxnginx         NodePort    10.254.111.50    <none>        8080:32177/TCP   33s  集群内部,各pod之间访问kevin-nginx[root@k8s-master01 ~]# curl http://10.254.111.50:8080  外部访问kevin-nginx的地址为http://node_ip/32177http://172.16.60.244:32177http://172.16.60.245:32177http://172.16.60.246:32177

Kubernetes集群插件怎么部署

Kubernetes集群插件怎么部署

7 - 清理kubernetes集群

1)清理 Node 节点 (node节点同样操作)
停相关进程:[root@k8s-node01 ~]# systemctl stop kubelet kube-proxy flanneld docker kube-proxy kube-nginx清理文件:[root@k8s-node01 ~]# source /opt/k8s/bin/environment.shumount kubelet 和 docker 挂载的目录[root@k8s-node01 ~]# mount | grep "${K8S_DIR}" | awk '{print $3}'|xargs sudo umount删除 kubelet 工作目录[root@k8s-node01 ~]# sudo rm -rf ${K8S_DIR}/kubelet删除 docker 工作目录[root@k8s-node01 ~]# sudo rm -rf ${DOCKER_DIR}删除 flanneld 写入的网络配置文件[root@k8s-node01 ~]# sudo rm -rf /var/run/flannel/删除 docker 的一些运行文件[root@k8s-node01 ~]# sudo rm -rf /var/run/docker/删除 systemd unit 文件[root@k8s-node01 ~]# sudo rm -rf /etc/systemd/system/{kubelet,docker,flanneld,kube-nginx}.service删除程序文件[root@k8s-node01 ~]# sudo rm -rf /opt/k8s/bin/*删除证书文件[root@k8s-node01 ~]# sudo rm -rf /etc/flanneld/cert /etc/kubernetes/cert清理 kube-proxy 和 docker 创建的 iptables[root@k8s-node01 ~]# iptables -F && sudo iptables -X && sudo iptables -F -t nat && sudo iptables -X -t nat删除 flanneld 和 docker 创建的网桥:[root@k8s-node01 ~]# ip link del flannel.1[root@k8s-node01 ~]# ip link del docker0
2)清理 Master 节点 (master节点同样操作)
停相关进程:[root@k8s-master01 ~]# systemctl stop kube-apiserver kube-controller-manager kube-scheduler kube-nginx清理文件:删除 systemd unit 文件[root@k8s-master01 ~]# rm -rf /etc/systemd/system/{kube-apiserver,kube-controller-manager,kube-scheduler,kube-nginx}.service删除程序文件[root@k8s-master01 ~]# rm -rf /opt/k8s/bin/{kube-apiserver,kube-controller-manager,kube-scheduler}删除证书文件[root@k8s-master01 ~]# rm -rf /etc/flanneld/cert /etc/kubernetes/cert清理 etcd 集群[root@k8s-master01 ~]# systemctl stop etcd清理文件:[root@k8s-master01 ~]# source /opt/k8s/bin/environment.sh删除 etcd 的工作目录和数据目录[root@k8s-master01 ~]# rm -rf ${ETCD_DATA_DIR} ${ETCD_WAL_DIR}删除 systemd unit 文件[root@k8s-master01 ~]# rm -rf /etc/systemd/system/etcd.service删除程序文件[root@k8s-master01 ~]# rm -rf /opt/k8s/bin/etcd删除 x509 证书文件[root@k8s-master01 ~]# rm -rf /etc/etcd/cert/*

上面部署的dashboard是https证书方式,如果是http方式访问的kubernetes集群web-ui,操作如下:

1)配置kubernetes-dashboard.yaml (里面的"k8s.gcr.io/kubernetes-dashboard-amd64:v1.10.1"镜像已经提前在node节点上下载了)[root@k8s-master01 ~]# cd /opt/k8s/work/[root@k8s-master01 work]# cat kubernetes-dashboard.yaml# ------------------- Dashboard Secret ------------------- #  apiVersion: v1kind: Secretmetadata:  labels:    k8s-app: kubernetes-dashboard  name: kubernetes-dashboard-certs  namespace: kube-systemtype: Opaque  ---# ------------------- Dashboard Service Account ------------------- #  apiVersion: v1kind: ServiceAccountmetadata:  labels:    k8s-app: kubernetes-dashboard  name: kubernetes-dashboard  namespace: kube-system  ---# ------------------- Dashboard Role & Role Binding ------------------- #  kind: RoleapiVersion: rbac.authorization.k8s.io/v1metadata:  name: kubernetes-dashboard-minimal  namespace: kube-systemrules:  # Allow Dashboard to create 'kubernetes-dashboard-key-holder' secret.- apiGroups: [""]  resources: ["secrets"]  verbs: ["create"]  # Allow Dashboard to create 'kubernetes-dashboard-settings' config map.- apiGroups: [""]  resources: ["configmaps"]  verbs: ["create"]  # Allow Dashboard to get, update and delete Dashboard exclusive secrets.- apiGroups: [""]  resources: ["secrets"]  resourceNames: ["kubernetes-dashboard-key-holder", "kubernetes-dashboard-certs"]  verbs: ["get", "update", "delete"]  # Allow Dashboard to get and update 'kubernetes-dashboard-settings' config map.- apiGroups: [""]  resources: ["configmaps"]  resourceNames: ["kubernetes-dashboard-settings"]  verbs: ["get", "update"]  # Allow Dashboard to get metrics from heapster.- apiGroups: [""]  resources: ["services"]  resourceNames: ["heapster"]  verbs: ["proxy"]- apiGroups: [""]  resources: ["services/proxy"]  resourceNames: ["heapster", "http:heapster:", "https:heapster:"]  verbs: ["get"]  ---apiVersion: rbac.authorization.k8s.io/v1kind: RoleBindingmetadata:  name: kubernetes-dashboard-minimal  namespace: kube-systemroleRef:  apiGroup: rbac.authorization.k8s.io  kind: Role  name: kubernetes-dashboard-minimalsubjects:- kind: ServiceAccount  name: kubernetes-dashboard  namespace: kube-system  ---kind: ClusterRoleBindingapiVersion: rbac.authorization.k8s.io/v1beta1metadata:  name: kubernetes-dashboardsubjects:  - kind: ServiceAccount    name: kubernetes-dashboard    namespace: kube-systemroleRef:  kind: ClusterRole  name: cluster-admin  apiGroup: rbac.authorization.k8s.io---# ------------------- Dashboard Deployment ------------------- #  kind: DeploymentapiVersion: apps/v1beta2metadata:  labels:    k8s-app: kubernetes-dashboard  name: kubernetes-dashboard  namespace: kube-systemspec:  replicas: 1  revisionHistoryLimit: 10  selector:    matchLabels:      k8s-app: kubernetes-dashboard  template:    metadata:      labels:        k8s-app: kubernetes-dashboard    spec:      serviceAccountName: kubernetes-dashboard-admin      containers:      - name: kubernetes-dashboard        image: k8s.gcr.io/kubernetes-dashboard-amd64:v1.10.1        ports:        - containerPort: 9090          protocol: TCP        args:          #- --auto-generate-certificates          # Uncomment the following line to manually specify Kubernetes API server Host          # If not specified, Dashboard will attempt to auto discover the API server and connect          # to it. Uncomment only if the default does not work.          #- --apiserver-host=http://10.0.1.168:8080        volumeMounts:        - name: kubernetes-dashboard-certs          mountPath: /certs          # Create on-disk volume to store exec logs        - mountPath: /tmp          name: tmp-volume        livenessProbe:          httpGet:            scheme: HTTP            path: /            port: 9090          initialDelaySeconds: 30          timeoutSeconds: 30      volumes:      - name: kubernetes-dashboard-certs        secret:          secretName: kubernetes-dashboard-certs      - name: tmp-volume        emptyDir: {}      serviceAccountName: kubernetes-dashboard      # Comment the following tolerations if Dashboard must not be deployed on master      tolerations:      - key: node-role.kubernetes.io/master        effect: NoSchedule  ---# ------------------- Dashboard Service ------------------- #  kind: ServiceapiVersion: v1metadata:  labels:    k8s-app: kubernetes-dashboard  name: kubernetes-dashboard  namespace: kube-systemspec:  ports:    - port: 9090      targetPort: 9090  selector:    k8s-app: kubernetes-dashboard  # ------------------------------------------------------------kind: ServiceapiVersion: v1metadata:  labels:    k8s-app: kubernetes-dashboard  name: kubernetes-dashboard-external  namespace: kube-systemspec:  ports:    - port: 9090      targetPort: 9090      nodePort: 30090  type: NodePort  selector:    k8s-app: kubernetes-dashboard  创建这个yaml文件[root@k8s-master01 work]# kubectl create -f kubernetes-dashboard.yaml  稍微等一会儿,查看kubernetes-dashboard的pod创建情况(如下可知,该pod落在了k8s-node03节点上,即172.16.60.246)[root@k8s-master01 work]# kubectl get pods -n kube-system -o wide|grep "kubernetes-dashboard"kubernetes-dashboard-7976c5cb9c-q7z2w   1/1     Running   0          10m     172.30.72.6   k8s-node03   <none>           <none>  [root@k8s-master01 work]# kubectl get svc -n kube-system|grep "kubernetes-dashboard"kubernetes-dashboard-external   NodePort    10.254.227.142   <none>        9090:30090/TCP                  10m

Kubernetes集群插件怎么部署

Kubernetes集群插件怎么部署

到此,关于“Kubernetes集群插件怎么部署”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Kubernetes集群插件怎么部署

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Kubernetes集群插件怎么部署

这篇文章主要介绍“Kubernetes集群插件怎么部署”,在日常操作中,相信很多人在Kubernetes集群插件怎么部署问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Kubernetes集群插件怎么部署”的疑
2023-06-29

kubernetes怎么部署redis集群

在Kubernetes中部署Redis集群通常可以使用Redis官方提供的Redis集群模式或者使用第三方工具如Redis Operator等来实现。以下是部署Redis集群的一般步骤:创建Redis配置文件:创建一个Redis集群的配置文
kubernetes怎么部署redis集群
2024-04-09

kubernetes中怎么部署coredns 插件

这期内容当中小编将会给大家带来有关kubernetes中怎么部署coredns 插件,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一:简介 从Kubernetes 1.10开始,在安装时将默认的DN
2023-06-04

Kubernetes​怎么部署高可用kube-apiserver集群

这篇文章主要讲解了“Kubernetes怎么部署高可用kube-apiserver集群”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Kubernetes怎么部署高可用kube-apiserv
2023-06-29

kubeadm中如何部署kubernetes集群

kubeadm中如何部署kubernetes集群,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一、环境要求这里使用RHEL7.5master、etcd:192.168.10.1
2023-06-19

Kubernetes集群部署工具大全

1. kubeadm: 是Kubernetes官方推荐的部署工具,用于快速设置单主机Kubernetes集群。2. kops: 是一个开源工具,用于在AWS上部署和管理生产级别的Kubernetes集群。3. Rancher: 是一个开源的
2023-09-22

Kubernetes容器集群管理环境怎么部署

本文小编为大家详细介绍“Kubernetes容器集群管理环境怎么部署”,内容详细,步骤清晰,细节处理妥当,希望这篇“Kubernetes容器集群管理环境怎么部署”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。通过K
2023-06-29

如何在kubernetes上部署consul集群

这篇文章主要介绍“如何在kubernetes上部署consul集群”,在日常操作中,相信很多人在如何在kubernetes上部署consul集群问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何在kubern
2023-06-04

Kubernetes 部署 Nebula 图数据库集群

Kubernetes 主要由以下几个核心组件组成:etcd  保存了整个集群的状态apiserver 提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制controller manager 负责维护集群的状态,比如故障检测、自动扩展、
Kubernetes 部署 Nebula 图数据库集群
2015-03-01

如何在Azure上部署Kubernetes集群

如何在Azure上部署Kubernetes集群,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。在实验、演示的时候,或者是生产过程中,我经常会需要运行一些 Docker 负载。
2023-06-05

Cloud Toolkit 中如何部署 EDAS Kubernetes 集群

这期内容当中小编将会给大家带来有关Cloud Toolkit 中如何部署 EDAS Kubernetes 集群,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1、在 IntelliJ IDEA 上单击 Cl
2023-06-19

怎么将前端Vue项目部署到Kubernetes集群上

这篇文章主要讲解了“怎么将前端Vue项目部署到Kubernetes集群上”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么将前端Vue项目部署到Kubernetes集群上”吧!1.准备您的V
2023-07-05

怎么部署redis集群

要部署Redis集群,您可以按以下步骤进行操作:1. 安装Redis:在每个节点上安装Redis服务器。您可以从Redis官方网站上下载并安装Redis软件包。2. 配置Redis节点:在每个节点上,编辑Redis配置文件(redis.co
2023-08-31

redis怎么部署集群

redis 集群部署通过将 redis 实例组织成分布式系统,提升性能和可用性。部署步骤包括:1. 安装 redis;2. 创建配置文件,启用集群;3. 创建集群节点配置文件,包含节点地址;4. 启动集群;5. 添加其他节点;6. 验证集群
redis怎么部署集群
2024-05-21

Kubernetes中如何使用Rancher部署K8S集群

本篇文章给大家分享的是有关Kubernetes中如何使用Rancher部署K8S集群,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1.安装Rancher这里使用三台机器来搭建K
2023-06-19

如何在Azure中部署Kubernetes容器集群

这篇文章主要讲解了“如何在Azure中部署Kubernetes容器集群”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何在Azure中部署Kubernetes容器集群”吧!在这个快速入门教程
2023-06-16

docker怎么部署etcd集群

本篇内容介绍了“docker怎么部署etcd集群”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!需要安装:dockerdocker-compo
2023-07-05

docker怎么部署redis集群

要部署 Redis 集群,可以使用 Docker 来简化部署过程。以下是一个基本的步骤:1. 创建 Redis 集群配置文件你可以创建一个名为 `redis.conf` 的 Redis 配置文件,并添加以下内容:```port 6379cl
2023-09-22

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录