接触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时需要,若本地不存在该镜像,会出现报错,因某种不可抗力因数,需要使用代理进行镜像拉取
- Azure 中国镜像
https://gcr.azk8s.cn - 阿里云加速器(需登录获取)
国内无法直接获取 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上执行以下脚本 undefined
磁盘配置
# 临时禁用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/
[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:
- 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
---
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.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
该命令会生成以下内容:
- [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]生成相关的各种证书
访问集群
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf /root/.kube/config
关于kubernetes的接入说明,具体可参看集群接入
验证集群
查看一下集群状态,确认个组件都处于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
# 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 docs.projectcalico.org/v3.9/manife… -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
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
"stable" has been added to your repositories
helm repo list
NAME URL
stable 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/
,如下图所示。
后续
针对上述涉及的内容,请关注后续文章