前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Kubernetes展望与思考之1.17初体验

Kubernetes展望与思考之1.17初体验

原创
作者头像
zouyee
修改2019-09-25 09:59:43
3.2K0
修改2019-09-25 09:59:43
举报
文章被收录于专栏:Kubernetes GOKubernetes GO
代码语言:txt
复制
接触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> ,例如

代码语言:txt
复制
# $ 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,解压加载以下面的基础镜像

代码语言:txt
复制
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,否则出现以下问题
代码语言:txt
复制
/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,则做以下修改:

代码语言:txt
复制
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):

编译过程
编译过程

最终生成以下镜像结果

代码语言:txt
复制
ls _output/release-images/amd64/
conformance-amd64.tar  kube-apiserver.tar           kube-proxy.tar
hyperkube-amd64.tar    kube-controller-manager.tar  kube-scheduler.tar

下面为二进制执行文件

代码语言:txt
复制
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如下所示:

代码语言:txt
复制
// 输入代码内容
cat /etc/hosts
10.142.21.132 kargo
10.142.114.189 paasn1

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

设置防火墙

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

代码语言:txt
复制
systemctl stop firewalld
systemctl disable firewalld
禁用SElinux
代码语言:txt
复制
# 临时禁用selinux
setenforce 0
# 永久禁用selinux
vi /etc/selinux/config
SELINUX=disabled
内核配置
代码语言:txt
复制
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上执行以下脚本

代码语言:txt
复制
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
磁盘配置
代码语言:txt
复制
# 临时禁用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:

代码语言:txt
复制
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

代码语言:txt
复制
{

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

}

重启docker服务

代码语言:txt
复制
systemctl restart docker

确认修改生效

代码语言:txt
复制
docker info | grep Cgroup
Cgroup Driver: systemd

enable 服务

代码语言:txt
复制
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版本。
代码语言:txt
复制
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
代码语言:txt
复制
# enable kubelet服务
systemctl daemon-reloads
systemctl enable kubelet.service
2.2 kubeadm初始化

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

代码语言:txt
复制
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: {}
代码语言:txt
复制
其中镜像地址可通过imageRepository参数进行自定义,若本地已加载所需镜像,则无须改变,根据测试环境的实际情况,kubernetesVersion对应`kubeadm version`中GitVersion版本,将kubeadm.conf修改为:
代码语言:txt
复制
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
代码语言:txt
复制
接下来使用kubeadm初始化集群,选择kargo作为Master Node,在kargo上执行下面的命令:

kubeadm init --config /root/kubeadm.conf

代码语言:txt
复制
该命令会生成以下内容:访问集群`mkdir -p $HOME/.kube

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

代码语言:txt
复制
关于kubernetes的接入说明,具体可参看[集群接入](https://kubernetes.io/docs/tasks/access-application-cluster/configure-access-multiple-clusters/)验证集群查看一下集群状态,确认个组件都处于healthy状态:
代码语言:txt
复制
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生成相关的各种证书
代码语言:txt
复制
# 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命令,当然可以如下自己生成,

代码语言:txt
复制
# 生成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节点上执行命令查看集群中的节点:

代码语言:txt
复制
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集群中任一节点中执行以下命令:

代码语言:txt
复制
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
集群重置*

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

代码语言:txt
复制
kubeadm reset
rm -rf /var/lib/cni/ /var/lib/etcd/
rm -rf /var/lib/kubelet /etc/kubernetes/
安装网络

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

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

代码语言:txt
复制
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是否运行正确

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

代码语言:txt
复制
#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服务地址:

代码语言:txt
复制
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版本:

代码语言:txt
复制
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文件:

代码语言:txt
复制
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下:

代码语言:txt
复制
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仓库地址为微软提供的镜像地址:

代码语言:txt
复制
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文件
代码语言:txt
复制
---
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
  • 验证结果
代码语言:txt
复制
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配置修改为:
代码语言:txt
复制
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

获取分配访问端口:

代码语言:txt
复制
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
Dashboard UI workloads page
后续

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

参考资料

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 确认修改生效
  • enable 服务
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档