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.17a
获取下面的基础镜像 其中prepare.tgz为编译基础镜像,117alpha.tgz为v1.17.0-alpha.0所需镜像及二进制文件 golang 1.12.9+
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部署简单如下所述:
- 下载部署脚本 curl https://docs.projectcalico.org/v3.9/manifests/calico.yaml -O
- 配置pod cidr 若pod cidr非192.168.0.0/16,则执行以下命令
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/,如下图所示。

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