Kubernetes展望与思考之1.17初体验

  • 2019 年 10 月 7 日
  • 筆記

接触kubernetes两年有余,从18年初加入kubernetes社区来算,已经一年半,或许是时候写点什么。简单文章如何写好,难点文章如何写透,或许是一种学问,打算推一个系列:《Kubernetes GO》算是对这两年的一个总结。

kubernetes 1.16已在前天正式发布.

kubeadm是Kubernetes官方提供的用于快速安装Kubernetes集群的工具,其中kubespray比较适合较大规模的集群部署,*步骤,为可选操作,该文章主要介绍,以下内容:

  • kubernetes编译
  • kubernetes部署
  • kubernetes测试(待续)

下面我们看看如何编译及部署,在使用kubeadm部署前,需要编译以下镜像及执行文件,下面我们以v1.17.0-alpha.0版本为例:

  1. 通过关注右侧公众号,输出1.17a 获取下面的基础镜像 其中prepare.tgz为编译基础镜像,117alpha.tgz为v1.17.0-alpha.0所需镜像及二进制文件
  2. golang 1.12.9+
  3. ip、iptables、ipset、mount、nsenter、ebtables、ethtool, socat, tc、touch、conntrack、ipvsadm、jq、sysstat、curl、libseccomp 等命令行

1.16版本回顾

9月18日,Kubernetes 1.16正式发布,其包含31项增强功能,其中8项增强功能已经GA,另有8项增强功能处于beta阶段,15项处于alpha阶段,该版本有以下亮点:

  • 自定义资源(CRD) CRD作为Kubernetes的可扩展机制之一得到广泛使用,其自1.7版本发布以来就一直处于beta阶段。Kubernetes 1.16版本,也标志着CRD迎来了GA版本。
  • 存储卷扩展 新版本当中包含一系列与存储卷以及卷修改相关的功能。CSI规范中的存储卷大小调整能力提升为beta阶段,允许用户对CSI规范下的存储卷插件进行大小调整。
  • 拓扑管理alpha Kubelet中旨在协调资源分配决策,从而提供优化效果更好的资源分配能力
  • 双栈alpha IPv4/IPv6双栈可以将IPv4与IPv6地址分配给各Pod与服务

若只需要部署v1.17.0-alpha.0版本,可跳过编译过程。

前期准备

社区的文档介绍了如果编译相关镜像等工作,如果有兴趣,可仔细阅读,确认golang版本go version >= 1.12.9:

下载编译镜像*

目前基础镜像为k8s.gcr.io/kube-cross:v1.12.9-1,如果需要确认读者目前所需镜像,在执行KUBE_GIT_VERSION=v1.17.0-alpha.0 KUBE_FASTBUILD=true KUBE_BUILD_PULL_LATEST_IMAGES=n make release-images时需要,若本地不存在该镜像,会出现报错,因某种不可抗力因数,需要使用代理进行镜像拉取

国内无法直接获取 gcr.io/* 镜像,我们可以将 gcr.io/<repo-name>/<image-name>:<version> 替换为 gcr.azk8s.cn/<repo-name>/<image-name>:<version> ,例如

# $ docker pull k8s.gcr.io/kube-cross:v1.12.9-1  # k8s.gcr.io可以转换为gcr.io/google_containers  $ docker pull gcr.azk8s.cn/google_containers/kube-cross:v1.12.9-1  $ docker tag gcr.azk8s.cn/google_containers/kube-cross:v1.12.9-1 k8s.gcr.io/kube-cross:v1.12.9-1
编译代码

下面切换到$GOPATH/src/k8s.io目录,如无则创建,执行git clone https://github.com/kubernetes/kubernetes,

下载完成后,切换到该目录,执行以下操作

  • 获取基础镜像

通过右侧公众号获取的下载链接,解压prepare.tgz,解压加载以下面的基础镜像

tar -zxvf prepare.tgz  # docker load -i 解压的tar包,最终得到下列镜像  k8s.gcr.io/kube-cross                       v1.12.9-1   a808db72440c    5 weeks ago         1.87GB  k8s.gcr.io/debian-iptables-amd64            v11.0.2     01a746008995    5 months ago        45.4MB  k8s.gcr.io/debian-base-amd64                v1.0.0      204e96332c91    5 months ago        42.3MB  k8s.gcr.io/debian-hyperkube-base-amd64      v0.12.1     a46476511725    7 months ago        393MB
  • 修改设置 确认bash --version > 4.3,否则出现以下问题
/root/go/src/k8s.io/kubernetes/build/lib/release.sh:行385: docker_build_opts[@]: 为绑定变量  /root/go/src/k8s.io/kubernetes/build/lib/release.sh:行385: docker_build_opts[@]: 为绑定变量  /root/go/src/k8s.io/kubernetes/build/lib/release.sh:行385: docker_build_opts[@]: 为绑定变量  /root/go/src/k8s.io/kubernetes/build/lib/release.sh:行385: docker_build_opts[@]: 为绑定变量

若不打算更新bash,则做以下修改:

git diff build/lib/release.sh  diff --git a/build/lib/release.sh b/build/lib/release.sh  index 73c0bcc..e7bd1b1 100644  --- a/build/lib/release.sh  +++ b/build/lib/release.sh  @@ -382,7 +382,7 @@ EOF           if [[ "${KUBE_BUILD_PULL_LATEST_IMAGES}" =~ [yY] ]]; then               docker_build_opts+=("--pull")           fi  -        "${DOCKER[@]}" build "${docker_build_opts[@]}" -q -t "${docker_image_tag}" "${docker_build_path}" >/dev/null  +        "${DOCKER[@]}" build -q -t "${docker_image_tag}" "${docker_build_path}" >/dev/null

修改完记得提交,若编译前,对代码有改动,且未提交,即未执行git commit操作,执行编译KUBE_GIT_VERSION=v1.17.0-alpha.0 KUBE_FASTBUILD=true KUBE_BUILD_PULL_LATEST_IMAGES=n make release-images,则生成的镜像即版本为dirty版本,其他编译操作参见下面链接:

若编译前,对代码有改动,且未提交,即未执行git commit操作,则生成的镜像即版本为dirty版本,执行下述命令(可执行bash -x):

编译过程

最终生成以下镜像结果

ls _output/release-images/amd64/  conformance-amd64.tar  kube-apiserver.tar           kube-proxy.tar  hyperkube-amd64.tar    kube-controller-manager.tar  kube-scheduler.tar

下面为二进制执行文件

ls _output/dockerized/bin/linux/amd64/  apiextensions-apiserver  e2e.test            genyaml     hyperkube                kubelet         mounter  conversion-gen           gendocs             ginkgo      kubeadm                  kubemark        openapi-gen  deepcopy-gen             genkubedocs         go2make     kube-apiserver           kube-proxy  defaulter-gen            genman              go-bindata  kube-controller-manager  kube-scheduler  e2e_node.test            genswaggertypedocs  go-runner   kubectl                  linkcheck  # 将kubelet、kubeadm、kubectl拷贝到/usr/bin/目录。

下述表单为kubeadm及kubernetes维护时限

kubeadm 成熟程度

功能

成熟程度

命令行用户体验

beta

功能实现

beta

配置文件 API

alpha

自托管

alpha

kubeadm alpha 子命令

alpha

CoreDNS

GA

动态 Kubelet 配置

alpha

维护周期

Kubernetes 发现版本的通常只维护支持九个月,在维护周期内,如果发现有比较重大的 bug 或者安全问题的话,

可能会发布一个补丁版本。下面是 Kubernetes 的发布和维护周期,同时也适用于 kubeadm

Kubernetes 版本

发行月份

终止维护月份

v1.10.x

2018 年 3 月

2018 年 12 月

v1.11.x

2018 年 6 月

2019 年 3 月

v1.12.x

2018 年 9 月

2019 年 6 月

v1.13.x

2018 年 12 月

2019 年 9 月

v1.14.x

2019 年 3 月

2019 年 12 月

v1.15.x

2019 年 6 月

2020 年 3 月

v1.16.x

2019 年 9 月

2020 年 6 月


系统配置

在安装之前,需要做一些设置处理,当前准备两台CentOS 7.x如下所示:

// 输入代码内容  cat /etc/hosts  10.142.21.132 kargo  10.142.114.189 paasn1

下面需要对各主机进行安装前检查

设置防火墙

简单起见,可以关闭所有节点的防火墙:

systemctl stop firewalld  systemctl disable firewalld
禁用SElinux
# 临时禁用selinux  setenforce 0  # 永久禁用selinux  vi /etc/selinux/config  SELINUX=disabled
内核配置
cat <<EOF >  /etc/sysctl.d/k8s.conf  net.bridge.bridge-nf-call-ip6tables = 1  net.bridge.bridge-nf-call-iptables = 1  EOF  sysctl -p /etc/sysctl.d/k8s.conf

确认br_netfilter模块

lsmod | grep br_netfilter

启用此内核模块,以便遍历桥的数据包由iptables进行处理以进行过滤和端口转发,并且群集中的kubernetes窗格可以相互通信

modprobe br_netfilter

安装依赖命令行

yum install -y conntrack ipvsadm ipset jq sysstat curl iptables libseccomp socat -y

若kube-proxy需要开启ipvs,则下述模块需要存在

  • ip_vs
  • ip_vs_rr
  • ip_vs_wrr
  • ip_vs_sh
  • nf_conntrack_ipv4

可选:

若kube-proxy需要开启ipvs,则下述模块需要存在, 在所有的Kubernetes节点kargo和paasn1上执行以下脚本

cat > /etc/sysconfig/modules/ipvs.modules <<EOF  #!/bin/bash  modprobe -- ip_vs  modprobe -- ip_vs_rr  modprobe -- ip_vs_wrr  modprobe -- ip_vs_sh  modprobe -- nf_conntrack_ipv4  EOF    chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4
磁盘配置
# 临时禁用swap即可,重启后,需要再此执行,当然也可以把磁盘信息写入/etc/fstab  swapoff -a
容器引擎安装

从docker官方库安装kubernetes最新兼容性测试的匹配版本,Kubernetes 1.16+支持的docker版本列表依然是1.13.1, 17.03, 17.06, 17.09, 18.06, 18.09

安装docker-ce的软件包依赖,当前安装18.09.7:

yum install -y yum-utils     device-mapper-persistent-data     lvm2  yum-config-manager   --add-repo   https://download.docker.com/linux/centos/docker-ce.repo    # 18.09.7  yum install docker-ce docker-ce-cli containerd.io -y  # 通过yum list docker-ce --showduplicates | sort -r 获取版本信息,执行以下命令安装指定版本  # yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.i

对于使用systemd作为的Linux的发行版,使用systemd作为docker的cgroup-river

可以确保服务器节点在资源紧张的情况更加稳定,因此这里修改各节点上docker的cgroup-driver为systemd。

创建/etc/docker/daemon.json

{      "exec-opts": "native.cgroupdriver=systemd"    }

重启docker服务

systemctl restart docker

确认修改生效

docker info | grep Cgroup  Cgroup Driver: systemd

enable 服务

systemctl enable docker

2. 使用kubeadm部署kubernetes

以下为kubernetes 1.16+软件版本依赖信息:

执行kubeadm config images list获取镜像版本信息

软件

版本或镜像

apiserver

k8s.gcr.io/kube-apiserver:v1.17.0-alpha.0

controller-manager

k8s.gcr.io/kube-controller-manager:v1.17.0-alpha.0

scheduler

k8s.gcr.io/kube-scheduler:v1.17.0-alpha.0

proxy

k8s.gcr.io/kube-proxy:v1.17.0-alpha.0

pause

k8s.gcr.io/pause:3.1

etcd

k8s.gcr.io/etcd:3.3.15-0

coredns

k8s.gcr.io/coredns:1.6.2

同样kubernetes-cni-0.7.5-0.x86_64也需要安装

2.1 安装kubeadm及kubelet

所有节点执行以下操作:

  • 安装依赖软件 解压117alpha.tgz,tar -xzvf 117alpha.tgz -C /root/,切换至/root/目录 执行rpm -ivh *.rpm
  • 安装kubelet、kubeadm、kubectl 若已经执行编译操作,则该操作跳过 否则,将/root/下上述执行文件拷贝到/usr/bin/目录下
  • 创建kubelet.service 其中kubelet配置通过命令行–config指定配置文件,其内容在kubeadm执行时,进行初始化。具体查看官网kubelet配置。 Kubernetes关于为了Kubelet动态配置的特性当前为beta版本。
cat <<EOF >/etc/systemd/system/kubelet.service.d/10-kubeadm.conf  # Note: This dropin only works with kubeadm and kubelet v1.11+  [Service]  Environment="KUBELET_KUBECONFIG_ARGS=--v=6 --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf"  Environment="KUBELET_CONFIG_ARGS=--config=/var/lib/kubelet/config.yaml"  # This is a file that "kubeadm init" and "kubeadm join" generates at runtime, populating the KUBELET_KUBEADM_ARGS variable dynamically  EnvironmentFile=-/var/lib/kubelet/kubeadm-flags.env  # This is a file that the user can use for overrides of the kubelet args as a last resort. Preferably, the user should use  # the .NodeRegistration.KubeletExtraArgs object in the configuration files instead. KUBELET_EXTRA_ARGS should be sourced from this file.  EnvironmentFile=-/etc/sysconfig/kubelet  ExecStart=  ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS  EOF  cat <<EOF >/etc/systemd/system/kubelet.service  [Unit]  Description=kubelet: The Kubernetes Node Agent  Documentation=[http://kubernetes.io/docs/](http://kubernetes.io/docs/)  [Service]  ExecStart=/usr/bin/kubelet  Restart=always  StartLimitInterval=0  RestartSec=10  [Install]  WantedBy=multi-user.target  EOF
# enable kubelet服务  systemctl daemon-reloads  systemctl enable kubelet.service
2.2 kubeadm初始化

使用kubeadm config print init-defaults可以打印集群初始化默认的使用的配置:

apiVersion: kubeadm.k8s.io/v1beta2  bootstrapTokens:  - groups:undefinedapiServer:    timeoutForControlPlane: 4m0s  apiVersion: kubeadm.k8s.io/v1beta2  certificatesDir: /etc/kubernetes/pki  clusterName: kubernetes  controllerManager: {}  dns:    type: CoreDNS  etcd:    local:      dataDir: /var/lib/etcd  imageRepository: k8s.gcr.io  kind: ClusterConfiguration  kubernetesVersion: v1.16.0  networking:    dnsDomain: cluster.local    serviceSubnet: 10.96.0.0/12  scheduler: {}
其中镜像地址可通过imageRepository参数进行自定义,若本地已加载所需镜像,则无须改变,根据测试环境的实际情况,kubernetesVersion对应`kubeadm version`中GitVersion版本,将kubeadm.conf修改为:
cat <<EOF >/root/kubeadm.conf  apiVersion: kubeadm.k8s.io/v1beta2  bootstrapTokens:  - groups:    - system:bootstrappers:kubeadm:default-node-token    token: abcdef.0123456789abcdef    ttl: 24h0m0s    usages:    - signing    - authentication  kind: InitConfiguration  localAPIEndpoint:    advertiseAddress: 10.142.21.132    bindPort: 6443  nodeRegistration:    criSocket: /var/run/dockershim.sock    name: kargo    taints:    - effect: NoSchedule      key: node-role.kubernetes.io/master  ---  apiServer:    timeoutForControlPlane: 4m0s  apiVersion: kubeadm.k8s.io/v1beta2  certificatesDir: /etc/kubernetes/pki  clusterName: kubernetes  controllerManager: {}  dns:    type: CoreDNS  etcd:    local:      dataDir: /var/lib/etcd  imageRepository: k8s.gcr.io  kind: ClusterConfiguration  kubernetesVersion: v1.17.0-alpha.0  networking:    dnsDomain: cluster.local    serviceSubnet: 10.96.0.0/12  scheduler: {}  EOF
接下来使用kubeadm初始化集群,选择kargo作为Master Node,在kargo上执行下面的命令:

kubeadm init --config /root/kubeadm.conf

该命令会生成以下内容:访问集群`mkdir -p $HOME/.kube

cp -i /etc/kubernetes/admin.conf /root/.kube/config`

关于kubernetes的接入说明,具体可参看[集群接入](https://kubernetes.io/docs/tasks/access-application-cluster/configure-access-multiple-clusters/)验证集群查看一下集群状态,确认个组件都处于healthy状态:
kubectl cluster-info  Kubernetes master is running at https://10.233.0.1  CoreDNS is running at https://10.233.0.1/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy      - system:bootstrappers:kubeadm:default-node-token  token: abcdef.0123456789abcdef  ttl: 24h0m0s  usages:      - signing      - authentication  kind: InitConfiguration  localAPIEndpoint:    advertiseAddress: 1.2.3.4    bindPort: 6443  nodeRegistration:    criSocket: /var/run/dockershim.sock    name: kargo    taints:      - effect: NoSchedule  key: node-role.kubernetes.io/master
  • kubelet-start 生成kubelet的配置文件”/var/lib/kubelet/config.yaml”
  • kubeconfig生成相关的kubeconfig文件
  • control-plane使用/etc/kubernetes/manifests目录中的yaml文件创建apiserver、controller-manager、scheduler的静态pod
  • bootstraptoken生成token记录下来,后边使用kubeadm join往集群中添加节点时会用到
  • certs生成相关的各种证书
# kubectl get cs  NAME                 STATUS    MESSAGE             ERROR  controller-manager   Healthy   ok  scheduler            Healthy   ok  etcd-0               Healthy   {"health":"true"}
加入节点

若有详细了解kubeadm join命令的需求,可参看kubeadm join

加入集群,需要提供CA密钥的哈希,格式:sha256:<hex_encoded_hash>,在成功kubeadm init后,输出结果会显示合适的join命令,当然可以如下自己生成,

# 生成token  kubeadm token create  a9trii.8d52xbbusol0glji    openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'  31b110e7fea9c86ddc6c1caa9f27f39021ea115ab7d2b5a86e157c42d9c8c57c    kubeadm join --discovery-token 9trii.8d52xbbusol0glji --discovery-token-ca-cert-hash sha256:31b110e7fea9c86ddc6c1caa9f27f39021ea115ab7d2b5a86e157c42d9c8c57c 10.142.21.132:6443 -v=6

paasn1加入集群成功后,在kargo节点上执行命令查看集群中的节点:

kubectl get node  NAME    STATUS   ROLES    AGE   VERSION  kargo   Ready    master   57m   v1.17.0-alpha.0  passn1   Ready    <none>   11s   v1.17.0-alpha.0
验证etcd安装*

如果配置正确,那么上述命令执行结果应该是任何输出的。如果结果有错,请参照上述配置和环境变量文件检查配置。一旦我们顺利启动etcd服务,我们还需要正确检查我们的etcd集群是否可用,在etcd集群中任一节点中执行以下命令:

docker ps|grep etcd  0214f9a78ba5        b2756210eeab                              "etcd --advertise-cl…"   4 hours ago         Up 4 hours                              k8s_etcd_etcd-kargo_kube-system_2b66f634d9a00ad56540109b231dd318_3  20419a0de748        k8s.gcr.io/pause:3.1                      "/pause"                 9 days ago          Up 1 days                               k8s_POD_etcd-kargo_kube-system_2b66f634d9a00ad56540109b231dd318_2     docker exec -it 168729f100e0 etcdctl --endpoint https://127.0.0.1:2379      --endpoint https://127.0.0.1:2379       --ca-file=/etc/ssl/etcd/ssl/ca.pem    --cert-file=/etc/ssl/etcd/ssl/ca.pem    --key-file=/etc/ssl/etcd/ssl/ca-key.pem    cluster-health   member 38ee253c41f760ca is healthy: got healthy result from https://10.142.21.132:2379   cluster is healthy
集群重置*

集群初始化如果遇到问题,可以使用下面的命令进行清理

kubeadm reset  rm -rf /var/lib/cni/ /var/lib/etcd/  rm -rf /var/lib/kubelet /etc/kubernetes/
安装网络

接下来,选择calico作为网络插件,具体说明,参见相关文档网络插件

其中calico部署简单如下所述:

POD_CIDR="<your-pod-cidr>"   sed -i -e "s?192.168.0.0/16?$POD_CIDR?g" calico.yaml

相关文档,参见calico部署

  • 执行部署脚本 kubectl apply -f calico.yaml
测试网络及dns

首先,确认calico及coredns相关pod是否运行正确

在一切正常情况下,你会得到类似如下的输出结果:

#kubectl get po -n kube-system|grep calico  calico-kube-controllers-744795b577-jc4r7                          1/1     Running                 0          1d  calico-node-7lbdm                                                 1/1     Running                 8          1d  #kubectl get po -n kube-system|grep dns  coredns-7f547f9899-7l9cq                                          1/1     Running                 0          1d  dns-autoscaler-7bf66d8bd8-l52bn                                   1/1     Running                 0          1d  kubectl run  busybox --image=busybox:latest --restart=Never

进入busybox执行nslookup,查询kubernetes服务地址:

kubectl run -it busybox sh  nslookup kubernetes.default    Server:    10.233.0.3  Address 1: 10.233.0.3 kube-dns.kube-system.svc.cluster.local  Name:      kubernetes.default  Address 1: 10.233.0.3 kubernetes.default.svc.cluster.local  ping 10.142.21.132    若ping通,则网络正常

部署插件*

为了更好的管理与使用kubernetes集群,开源社区提供了多种工具,如应用管理、监控、日志、负载均衡等,另外kubernetes提供两种扩展方式:使用聚合层第三方资源管理

软件包管理

Helm工具由Deis发起,该公司在17年初收购,该软件由客户端命helm令行工具和服务端tiller组成,Helm的安装十分简单。 下载helm命令行工具到master节点node1的/usr/local/bin下,这里下载的2.14.3版本:

curl -O [https://get.helm.sh/helm-v2.14.3-linux-amd64.tar.gz](https://get.helm.sh/helm-v2.14.3-linux-amd64.tar.gz)  tar -zxvf helm-v2.14.3-linux-amd64.tar.gz  cd linux-amd64/  cp helm /usr/local/bin/

软件包的管理理念并不是Deis,这里势必需要提及一下mesosphere,其开创软件包c/s管理模式,可惜在mesos vs kubernetes的战争中落败,而失去初始的光芒。

为了安装服务端tiller,需要在主机配置kubectl工具和kubeconfig文件,确保kubectl工具可以在这台机器上访问apiserver且正常使用。 这里的kargo节点已经配置好了kubectl。

因为Kubernetes APIServer开启了RBAC访问控制,所以需要创建tiller使用的service account: tiller并分配合适的角色给它。 详细内容可以查看helm文档中的RBAC。 这里简单起见直接分配cluster-admin这个集群内置的ClusterRole给它。创建helm-rbac.yaml文件:

cat <<EOF >/root/helm.yaml  apiVersion: v1  kind: ServiceAccount  metadata:    name: tiller    namespace: kube-system  ---  apiVersion: rbac.authorization.k8s.io/v1beta1  kind: ClusterRoleBinding  metadata:    name: tiller  roleRef:    apiGroup: rbac.authorization.k8s.io    kind: ClusterRole    name: cluster-admin  subjects:  - kind: ServiceAccount      name: tiller      namespace: kube-system  EOF    kubectl apply -f /root/helm.yaml

接下来部署tiller:

helm init --service-account tiller --skip-refresh tiller默认被部署在k8s集群中的kube-system这个namespace下:

kubectl get pod -n kube-system -l app=helm  NAME                             READY   STATUS    RESTARTS   AGE  tiller-deploy-7d666f8ccc-92h27   1/1     Running   5          1d

如上所述,使用代理镜像库

helm init --service-account tiller --tiller-image <你指定的镜像库名称>/tiller:v2.13.3 --skip-refresh

实际如下:

helm init --service-account tiller --tiller-image gcr.azk8s.cn/google_containers/tiller:v2.13.1 --skip-refresh

修改helm charts仓库地址为微软提供的镜像地址:

helm repo add stable [http://mirror.azure.cn/kubernetes/charts](http://mirror.azure.cn/kubernetes/charts)  "stable" has been added to your repositories    helm repo list    NAME  URL  stable [http://mirror.azure.cn/kubernetes/charts](http://mirror.azure.cn/kubernetes/charts)  local http://127.0.0.1:8879/charts
部署核心监控

kubernetes使用metrics-server提供节点及pod级别的资源监控, 其为metrics.k8s.io接口组,为弹性伸缩模块等模块提供接口,具体详见kubernetes监控架构

  • 拉取代码 git clone https://github.com/kubernetes-incubator/metrics-server
  • 修改配置 修改deploy/1.8+/metrics-server-deployment.yaml文件
---  apiVersion: v1  kind: ServiceAccount  metadata:    name: metrics-server    namespace: kube-system  ---  apiVersion: apps/v1  kind: Deployment  metadata:    name: metrics-server    namespace: kube-system    labels:      k8s-app: metrics-server  spec:    selector:      matchLabels:        k8s-app: metrics-server    template:      metadata:        name: metrics-server        labels:          k8s-app: metrics-server      spec:        serviceAccountName: metrics-server        volumes:        # mount in tmp so we can safely use from-scratch images and/or read-only containers        - name: tmp-dir          emptyDir: {}        containers:        - name: metrics-server          image: k8s.gcr.io/metrics-server-amd64:v0.3.4          imagePullPolicy: Always          args:          - --logtostderr          - --kubelet-insecure-tls          - --kubelet-preferred-address-types=InternalIP          volumeMounts:          - name: tmp-dir            mountPath: /tmp
  • 验证结果
kubectl get po -n kube-system -l k8s-app=metrics-server  NAME                              READY   STATUS    RESTARTS   AGE  metrics-server-66fc8cddfb-cwvcf   1/1     Running   6          1d    kubectl top node  NAME     CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%  kargo   1533m        19%    9430Mi          61%  paasn1   4443m        56%    10490Mi         67%
部署仪表盘

社区提供Dashboard项目,它为用户提供一个可视化的Web界面来查看当前集群的各种信息。用户可以使用Kubernetes Dashboard部署容器化的应用、监控应用的状态、执行故障排查任务以及管理Kubernetes各类资源。部署方式如下;

  • 拉取代码 https://github.com/kubernetes/dashboard
  • 修改配置 将aio/deploy/recommended/02_dashboard-service.yaml配置修改为:
kind: Service  apiVersion: v1  metadata:    labels:      k8s-app: kubernetes-dashboard    name: kubernetes-dashboard    namespace: kubernetes-dashboard  spec:    ports:      - port: 443        targetPort: 8443    selector:      k8s-app: kubernetes-dashboard    type: NodePort

获取分配访问端口:

kubectl get svc -n kubernetes-dashboard  NAME                   TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)         AGE  kubernetes-dashboard   NodePort   10.233.41.73   <none>        443:30479/TCP   1d获得主机端口30479,dashboard的界面绕过https,通过https://10.142.21.132:30479nodeport方式进行访问外,还可以执行以下代理操作kubectl proxy --accept-hosts='^.*' --address='10.142.113.20' --port 8080

我们还可以通过http://10.142.21.132:8080/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/,如下图所示。

Dashboard UI workloads page
后续

针对上述涉及的内容,请关注后续文章

参考资料