kubernetes 实战 1:使用 kubeadm 创建高可用集群

最近两年kubernetes越来越火热,生态圈越来越强大,朋友圈也经常有朋友发一些kubernetes的文章,周末闲着也是闲着,也写点东西吧,从集群的安装、监控、日志收集、CI/CD以及其它生产环境中一些场景,文章还是以实战内容为主。

 

k8s 集群主要有以下几个组件:


  • etcd:  一款分布式的一致性KV存储存储和服务发现系统,存储了整个集群的状态

  • kube-apiserver:  提供kubernetes集群的API调用

  • kube-controller-manager:负责维护集群的状态,比如故障检测、自动扩展、滚动更新等

  • kube-scheduler:负责资源的调度

  • kubelet:负责维护容器的生命周期,同时也负责Volume(CSI)和网络(CNI)的管理

  • kube-proxy:负责为Service提供cluster内部的服务发现和负载均衡

  • Container runtime:负责镜像管理以及Pod和容器的真正运行(CRI)

  • flannel:  一款网络插件,集群中的pod通讯主要依赖于它

  • coredns:   负责为整个集群提供DNS服务

 

一. 环境和版本信息


OS:  CentOS 7.6.1810
HAProxy Vervion:  1.5.18
Docker Version:  Docker-CE 18.09.1
Kubetnetes Version:  v1.15.1
HAProxy:  192.168.199.200
Control-plane Node(master node):
    node-01:  192.168.199.201
    node-02:  192.168.199.202
    node-03:  192.168.199.203
Worker Node:
    node-04:  192.168.199.204
    node-05:  192.168.199.205
    node-06:  192.168.199.206

 

二. 系统配置:


    1. 关闭防火墙

sudo systemctl stop firewalld
sudo systemctl disable firewalld

   2. 关闭selinux

setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config

    3. 关闭swap

sudo swapoff -a

     注释swap挂载,如下图:

kubernetes 实战 1:使用 kubeadm 创建高可用集群_第1张图片

 

三. 安装docker、kubeadm、kubelet、kubectl


1. 安装docker-ce

  • 安装依赖包

sudo yum install -y yum-utils device-mapper-persistent-data lvm2
  • 添加 yum 源

sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
  • ​​​​​​安装 docker-ce

sudo yum install -y docker-ce-18.09.1-3.el7
  • 官方推荐修改 cgroup driver 为 systemd,更稳定,详见:https://kubernetes.io/docs/setup/cri 

mkdir /etc/docker
cat < /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
systemctl restart docker
systemctl enable docker

2. 配置 CNI插件(flannel) 所需的iptables转发参数

cat <  /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

3. 安装kubeadm、kubelet、kubectl

  • 官方 yum 源国内访问不了,这里添加阿里云 yum 源

cat < /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes Repo
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
gpgcheck=0
enabled=1
EOF
  • yum 安装

sudo yum install -y kubelet-1.15.1 kubeadm-1.15.1 kubectl-1.15.1 --disableexcludes=kubernetes
systemctl enable kubelet

提示:上面步骤二 和 步骤三 所有k8s节点都需要执行

 

四. 安装haproxy


1配置 kube-apiserver 高可用需要一个负载均衡器,这里直接使用了一个单节点 haproxy 代替一下,实际生产环境中使用 keepalived 保证 haproxy 的高可用

sudo yum install -y haproxy

2. 将 master node 的 kube-apiserver 的 6443 添加到 haproxy做负载均衡

vi /etc/haproxy/haproxy.cfg
frontend k8s_apiserver *:6443
  mode tcp
  default_backend k8s

backend k8s
  mode tcp
  balance    roundrobin
  server     node-01 192.168.199.201:6443 check
  server     node-02 192.168.199.202:6443 check
  server     node-03 192.168.199.203:6443 check

3. reload 应用配置

systemctl reload haproxy

4. 查看6443端口是否已经在监听状态

kubernetes 实战 1:使用 kubeadm 创建高可用集群_第2张图片744071fcbbc3f7ae3968d0586ed94472cd4.jpg

 

五. 安装 master node


1.  创建 kubeadm 配置文件

cat < kubeadm-config.yaml
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
kubernetesVersion: v1.15.1
controlPlaneEndpoint: "192.168.199.200:6443"
imageRepository: "registry.aliyuncs.com/google_containers"
networking:
  podSubnet: "10.244.0.0/16"
apiServer:
  certSANs:
  - "k8s.mytest.com"
EOF
# controlPlaneEndpoint   haproxy 的负载均衡监听地址
# imageRepository  默认使用gcr.io镜像站,国内访问不了,这里指定从阿里云的镜像站拉镜像

2. 初始化集群

sudo kubeadm init --config=kubeadm-config.yaml --upload-certs
  • 初始化成功,记录下最后提示的 kubeadm join xxx 命令, 第一个是往集群添加master node,第二个是往集群添加 worker node

kubernetes 实战 1:使用 kubeadm 创建高可用集群_第3张图片

3.  为 kubectl 配置kube-config

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config  sudo chown $(id -u):$(id -g) $HOME/.kube/config

4.  安装 CNI插件 flannel

wget https://raw.githubusercontent.com/coreos/flannel/62e44c867a2846fefb68bd5f178daf4da3095ccb/Documentation/kube-flannel.yml
  •  默认是从quay.io拉取flannel镜像,但是经常因为网络原因拉不了,这里从阿里云找了一个替换了一下

sed -i s#'quay.io/coreos/flannel:v0.11.0-amd64'#'registry.cn-hangzhou.aliyuncs.com/mygcrio/flannel:v0.11.0-amd64'#g kube-flannel.yml
kubectl apply -f kube-flannel.yml

 5. 使用上面记录的kubeadm jion ... 命令将另外两个master节点(node-02,node-03)添加进集群
 

kubeadm join 192.168.199.200:6443 --token ax13yr.yzsps775bllh0mlo \
 --discovery-token-ca-cert-hash sha256:07b2b093be7ddabe7372b2c765b20343aa92f67db99286be1dc46b867a330f95 \
 --control-plane --certificate-key b68cd457e26c827994c9804f8adf7a22720aba5a5e9f8e4e487a587b2c2fc127

6.  查看etcd 集群状态

docker run --rm -it --net host -v /etc/kubernetes:/etc/kubernetes \
registry.aliyuncs.com/google_containers/etcd:3.3.10 etcdctl \
 --cert-file /etc/kubernetes/pki/etcd/peer.crt \
 --key-file /etc/kubernetes/pki/etcd/peer.key \
 --ca-file /etc/kubernetes/pki/etcd/ca.crt \
 --endpoints https://192.168.199.201:2379 cluster-health
  • 51ce89e017ae82b3226261dc4f5a4a3449b.jpg图中可以看出etcd 集群健康状态正常,到这里master node基本已经安装结束,下面开始添加worker node。

 

六. 添加 worker node


1. 执行 步骤 1.系统配置 和 步骤 2.安装docker、kubeadm、kubelet 

2. 执行集群初始化完成后记录的第二条 kubeadm join ... 命令: 

kubeadm join 192.168.199.200:6443 --token ax13yr.yzsps775bllh0mlo \
    --discovery-token-ca-cert-hash sha256:07b2b093be7ddabe7372b2c765b20343aa92f67db99286be1dc46b867a330f95  

  kubernetes 实战 1:使用 kubeadm 创建高可用集群_第4张图片

 

七. 检查集群


1. 查看node

  • 各节点状态正常,如果有节点状态为 NotReady,有可能是该节点还未完全初始化成功,可以稍等片刻再查看是否正常。

  • 如果想将 master node 同时当做 worker node使用,执行如下命令即可:

kubectl taint nodes --all node-role.kubernetes.io/master-

2. 查看 pod 

  • 如果有系统组件pod状态异常,使用 kubectl describe pod xxx 查看详细信息。

kubernetes 实战 1:使用 kubeadm 创建高可用集群_第5张图片

 

八.  add-ons


  • dashboard 提供集群的GUI

  • metrics server 提供资源监控(heapster 目前已经被官方弃用)

     

1. 安装 dashboard

  • 生产环境中使用 dashboard 推荐使用 HTTPS,证书获取这里就不写了,可以到阿里云申请免费的DV证书或者 let's encrypt也可以,我这里使用 acme 申请了一个 let's encrypt 的证书,我这里证书文件放在了 $HOME/certs 目录下,里面包含dashboard.crt、dashboard.key两个证书文件;

  • 导入证书

kubectl create secret generic kubernetes-dashboard-certs --from-file=$HOME/certs -n kube-system
  • 下载和修改部署官方yaml文件的image,官方的镜像站 k8s.gcr.io 访问不了~访问不了~访问不了~~~

wget https://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml
sed -i s#'k8s.gcr.io/kubernetes-dashboard-amd64'#'registry.aliyuncs.com/google_containers/kubernetes-dashboard-amd64'#g kubernetes-dashboard.yaml
  • 部署

kubectl create -f kubernetes-dashboard.yaml
  • 查看 pod 是否已经 running

kubectl get pods -n kube-system
  • 创建完成后我们还不能直接访问dashboard,因为 dashboard  服务还没暴露出来,生产中一般使用 ingress 对外服务,这里我们先用 nodeport 方式暴露出来,下篇文章会写到 ingress 的使用;

kubectl expose svc kubernetes-dashboard --port=443 --target-port=8443 --type=NodePort --name=test-dashboard -n kube-system
  • 查看 service test-dashboard 的 nodeport 端口号:

kubectl describe svc test-dashboard -n kube-system

kubernetes 实战 1:使用 kubeadm 创建高可用集群_第6张图片

  • 使用任意节点 ip:端口号 访问;使用ip可能会提示非安全访问,因为访问的域名和签名申请的证书域名不一致导致,这里先选择继续访问即可,后续写到 ingress 的时候也会解决

kubernetes 实战 1:使用 kubeadm 创建高可用集群_第7张图片

  • 已经安装成功,但是还需创建一个管理员用户登录:

vi admin-user.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: admin-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: admin-user
  namespace: kube-system
  • 查看 token

kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}')

kubernetes 实战 1:使用 kubeadm 创建高可用集群_第8张图片

  • 登录dashboard

kubernetes 实战 1:使用 kubeadm 创建高可用集群_第9张图片

 

2. 安装 metrics-server

  • 拉取 metrics-server 仓库

git clone https://github.com/kubernetes-incubator/metrics-server.git
  • 部署,官方image还是下载不了,替换image

sed -i s#'k8s.gcr.io'#'registry.aliyuncs.com/google_containers'#g metrics-server/deploy/1.8+/metrics-server-deployment.yaml
kubectl create -f metrics-server/deploy/1.8+/
  • 确定 pod 已经 running

kubectl get pods -n kube-system
  • 编辑 deployment, 添加参数:

args:
- --kubelet-insecure-tls
- --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname

kubernetes 实战 1:使用 kubeadm 创建高可用集群_第10张图片

  • 2c4410fb71102d100e659f8a5b41bd16494.jpg成功获取cpu和内存指标,如果出现 "error: metrics not available yet", 那就稍等几分钟再试,metrics server 需要采集指标数据

ba54bcbaa238399cfb8ae89976498834148.jpgkubernetes 实战 1:使用 kubeadm 创建高可用集群_第11张图片  

 

参考:

  • 官方文档

  • kubernetes-handbook

 

下一篇主题:Traefik 安装和使用

关注 公众号 “运维实战笔记” 获取最新文章

转载于:https://my.oschina.net/u/4084242/blog/3084185

你可能感兴趣的:(kubernetes 实战 1:使用 kubeadm 创建高可用集群)