Kubernetes展望与思考之1.17初体验

接触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> ,例如

1
2
3
4
# $ 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,解压加载以下面的基础镜像

1
2
3
4
5
6
7

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,否则出现以下问题
1
2
3
4
/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,则做以下修改:

1
2
3
4
5
6
7
8
9
10
11
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):

编译过程

最终生成以下镜像结果

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

下面为二进制执行文件

1
2
3
4
5
6
7
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如下所示:

1
2
3
cat /etc/hosts
10.142.21.132 kargo
10.142.114.189 paasn1

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

设置防火墙

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

1
2
systemctl stop firewalld
systemctl disable firewalld
禁用SElinux
1
2
3
4
5
# 临时禁用selinux
setenforce 0
# 永久禁用selinux
vi /etc/selinux/config
SELINUX=disabled
内核配置
1
2
3
4
5
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上执行以下脚本

1
2
3
4
5
6
7
8
9
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
磁盘配置
1
2
# 临时禁用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:

1
2
3
4
5
6
7
8
9
10
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

1
2
3
{
"exec-opts": ["native.cgroupdriver=systemd"]
}

重启docker服务

1
2
3
4
5
6
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版本。
1
2
3
4
5
6
7
8
9
10
11
12
13
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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
1
2
3
4
# enable kubelet服务
systemctl daemon-reloads
systemctl enable kubelet.service

2.2 kubeadm初始化

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
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修改为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
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]生成相关的各种证书
访问集群
1
2
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf /root/.kube/config

关于kubernetes的接入说明,具体可参看集群接入

验证集群

查看一下集群状态,确认个组件都处于healthy状态:

1
2
3
4
5
6
7
8
9
# 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:,在成功kubeadm init后,输出结果会显示合适的join命令,当然可以如下自己生成,

1
2
3
4
5
6
7
8
# 生成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节点上执行命令查看集群中的节点:

1
2
3
4
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集群中任一节点中执行以下命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
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
集群重置*

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

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

接下来,选择calico作为网络插件,具体说明,参见相关文档网络插件
其中calico部署简单如下所述:

1
2
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是否运行正确
在一切正常情况下,你会得到类似如下的输出结果:

1
2
3
4
5
6
7
8
9
#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服务地址:

1
2
3
4
5
6
7
8
9
10
11
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版本:

1
2
3
4
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文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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下:

1
2
3
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仓库地址为微软提供的镜像地址:

1
2
3
4
5
6
7
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文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
---
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
  • 验证结果
1
2
3
4
5
6
7
8
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配置修改为:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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

获取分配访问端口:

1
2
3
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方式进行访问外,还可以执行以下代理操作

1
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

后续

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

参考资料