Kubernetes(k8s)集群部署+Kuboard可视化管理

kubenetes(k8s)集群部署分为:单master+多node  (测试,开发)      多master+多node (生产环境) (也称为k8s高可用集群) 本文介绍的是 单master+多node         多master+多node 在后续...

kubenetes(k8s)集群部署分为:单master+多node  (测试,开发)      多master+多node (生产环境) (也称为k8s高可用集群)

本文介绍的是 单master+多node         多master+多node 在后续推出 敬请期待


就k8s的集群部署而言方式也有多种:1、官方工具kubeadm   2、kuboard脚本/工具   3、其它第三方部署脚本/工具

本文为了便于与大家的沟通交流学习就用官方的kubeadm进行部署,如果你是开发人员或者测试推荐用kuboard脚本/工具进行一键快速部署


环境:


使用官方的kubeadm安装kubernetes1.16.3集群    Docker版本 19.03.5 

k8s的可视化WEB管理用Kuboard (一款免费的 Kubernetes 图形化管理工具,帮助用户快速在 Kubernetes 上落地微服务)

注意:k8s的管理有两种 :kubectl 命令行 web管理 (官方的Dashboard、第三方web管理 如:kuboard)


服务器环境:  

Master

10.11.12.6

centos7.6

4核心8G内存

Node1

10.11.12.7

centos7.6

4核心16G内存

Node2

10.11.12.8

Centos7.6

4核心16G内存

注意:每台机器不低于2CPU2G内存,集群各服务器网络相通(内外均可),各服务器不能重复主机名(localhost)


准备配置:(masternode

 

禁用 Swap 交换分区 : swapoff -a (临时关闭)  

yes | cp /etc/fstab /etc/fstab_bak && cat /etc/fstab_bak |grep -v swap > /etc/fstab  (永久关闭)

                      或者直接:sed -i 's/.*swap.*/#&/' /etc/fstab    即  注释掉所有swap相关的行

# yum -y install vim wget net-tools epel-release ntpdate make ipset ipvsadm          //安装一些工具

# systemctl stop firewalld.service && systemctl disable firewalld.service             //关闭防火墙

# vim /etc/selinux/config       SELINUX=enforcing改为SELINUX=disabled             //关闭Selinux (需要重启服务器)

# hostnamectl set-hostname master   Node改为: hostnamectl set-hostname node     //更改服务器名  或者使用nmtui工具更改

# ntpdate server cn.pool.ntp.org   或者  yes | cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime  //同步时间

#  echo "net.core.somaxconn=4096" >> /etc/sysctl.conf && sysctl -p                 // tcp内核参数优化

                                    

配置hosts解析    

# vim /etc/hosts

10.11.12.6 master

10.11.12.7 node1

10.11.12.8 node2

 

配置转发相关参数

# vim /etc/sysctl.d/k8s.conf   添加如下内容:                    // sysctl.d 目录 表示在启动时配置内核参数

net.bridge.bridge-nf-call-ip6tables = 1

net.bridge.bridge-nf-call-iptables = 1

net.ipv4.ip_forward = 1

vm.swappiness=0           (不用交换分区)

执行命令使修改生效

# sysctl -p /etc/sysctl.d/k8s.conf         或者 sysctl -p

 

加载ipvs相关内核模块     (为kube-proxy开启ipvs提供条件 新版本k8s由iptables换成了 ipvs       

# modprobe ip_vs && modprobe ip_vs_rr && modprobe ip_vs_wrr

# modprobe ip_vs_sh && modprobe nf_conntrack_ipv4

为了开机自动加载  建立一个脚本:

# cat > /etc/sysconfig/modules/ipvs.modules.sh <<EOF

#!/bin/bash

#chkconfig: 345 88 14         

modprobe -- ip_vs

modprobe -- ip_vs_rr

modprobe -- ip_vs_wrr

modprobe -- ip_vs_sh

modprobe -- nf_conntrack_ipv4

modprobe -- br_netfilter

EOF

 

# chmod 777 /etc/sysconfig/modules/ipvs.modules.sh && bash /etc/sysconfig/modules/ipvs.modules.sh

# echo "bash /etc/sysconfig/modules/ipvs.modules.sh" >> /etc/rc.d/rc.local

# chmod 777 /etc/rc.d/rc.local && chmod 777 /etc/rc.local

# lsmod | grep -e ip_vs -e nf_conntrack_ipv4     或者:# lsmod | grep ip_vs

备注:<<EOF 表示开始    EOF 表示结束   通过cat配合重定向能够生成文件并追加操作

 

修改文件限制

echo "* soft nofile 65536" >> /etc/security/limits.conf

echo "* hard nofile 65536" >> /etc/security/limits.conf

echo "* soft nproc 4096" >> /etc/security/limits.conf

echo "* hard nproc 4096" >> /etc/security/limits.conf


安装Docker   (master与node)


# yum install -y yum-utils device-mapper-persistent-data lvm2

# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# yum -y install docker-ce && systemctl start docker && systemctl enable docker && docker --version


修改docker Cgroup Driver为systemd 

# mkdir /etc/docker

# cat > /etc/docker/daemon.json <<EOF

{

  "exec-opts": ["native.cgroupdriver=systemd"],                    指定systemd的方式

  "log-driver": "json-file",

  "log-opts": {

    "max-size": "100m"

  },

  "storage-driver": "overlay2",

  "storage-opts": [

    "overlay2.override_kernel_check=true"

  ]

}

EOF


# mkdir -p /etc/systemd/system/docker.service.d


重新启动Docker

# systemctl daemon-reload && systemctl restart docker


安装kubeadm、kubelet、kubectl  (master与node)


添加阿里云k8s源

cat > /etc/yum.repos.d/kubernetes.repo <<EOF

[kubernetes]

name=Kubernetes

baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/

enabled=1

gpgcheck=0

repo_gpgcheck=0

gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg

EOF


# yum install -y kubelet kubeadm kubectl ipvsadm

# systemctl enable kubelet && systemctl start kubelet && kubelet --version    //开启并查看其版本  


使用kubeadm init初始化集群   (Master 操作)


# kubeadm init \

  --image-repository registry.aliyuncs.com/google_containers \         //指定Kubenetes的Registries为国内阿里云的   

            或者     gcr.azk8s.cn/google-containers \                           国外服务器请忽略

  --kubernetes-version=v1.16.3 \                                       //指定版本信息. 与上面kubelet版本对应

  --pod-network-cidr=10.244.0.0/16 \                            //容器集群网络段可自定义,10.244.0.0/16是flannel默认使用的网络

  --apiserver-advertise-address=10.11.12.6                    // 指定master服务器地址 (不指定默认为localhost)

  --service-cidr=10.96.0.0/12                      // (无特殊需求可选,是Service分配使用的网络地址由kubernetes管理 默认为10.96.0.0/12)

                                                                 (pod网络是pod/容器的网络段    service网络是k8s内部对于服务的一个抽象层)

正常情况下master拉取镜像并初始化成功出现 Your Kubernetes control-plane has initialized successfully!


如果初始化时拉取镜像卡住或者初始化失败,需要执行kubeadm reset 或者 kubeadm reset -f 清理,重新执行初始化


但往往会卡在这一步 即报错timeout 错误镜像拉取失败

attachments-2020-05-5O2mj0qs5ec3753a1245f.png


下载离线的各种镜像 

  

查看需要安装的镜像:kubeadm config images list

attachments-2020-05-F8lBwpNe5ec3762693dba.png


根据需要的版本,直接拉取国内镜像,并修改tag

脚本: vim kubeadm.sh

#!/bin/bash

## 使用如下脚本下载国内镜像,并修改taggoogletag

set -e

KUBE_VERSION=v1.16.3

KUBE_PAUSE_VERSION=3.1

ETCD_VERSION=3.3.15-0

CORE_DNS_VERSION=1.6.2

GCR_URL=k8s.gcr.io

ALIYUN_URL=registry.cn-hangzhou.aliyuncs.com/google_containers

images=(kube-proxy:${KUBE_VERSION}

kube-scheduler:${KUBE_VERSION}

kube-controller-manager:${KUBE_VERSION}

kube-apiserver:${KUBE_VERSION}

pause:${KUBE_PAUSE_VERSION}

etcd:${ETCD_VERSION}

coredns:${CORE_DNS_VERSION})

for imageName in ${images[@]} ; do

  docker pull $ALIYUN_URL/$imageName

  docker tag  $ALIYUN_URL/$imageName $GCR_URL/$imageName

  docker rmi $ALIYUN_URL/$imageName

done

 

运行脚本,拉取镜像   (注意版本需要根据实际情况)

# chmod 777 kubeadm.sh && bash kubeadm.sh


查看拉取的镜像:

docker images

attachments-2020-05-x7J2YwN85ec3768229d14.png


重新init 初始化:

# kubeadm init \

  --kubernetes-version=v1.16.3 \                                      

  --pod-network-cidr=10.244.0.0/16 \                                

  --apiserver-advertise-address=10.11.12.6                        


初始化成功则:    

attachments-2020-05-FglYP33E5ec376d738b2e.png


按提示配置Kubernetes 集群安全配置文件     (复制上面命令即可)


# mkdir -p $HOME/.kube

# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

# chown $(id -u):$(id -g) $HOME/.kube/config


kubeadm join token            (这行信息为node节点加入集群要执行的命令,请务必复制下来)

kubeadm join 10.11.12.6:6443 --token 2r3suf.zutgcutjwnw4pze5 \

    --discovery-token-ca-cert-hash sha256:80bf791916b3356a25e25149a4fd4c47fa82a06fe52bcfdf4ec23f5f27bc064b


如果我们忘记了Master节点的join token,可以使用如下命令来查看:

# kubeadm token list (24小时内)     重新生成 # kubeadm token create

Kubernetes API  本机IP + 端口6443


查看集群状态:

# kubectl get cs

attachments-2020-05-rEs2fuOV5ec3775a159b7.png


1.6版本的kubernetes在执行kubectl get cs时输出内容有一些变化,直接输出为unknown,需要加参数   (1.17 1.18 版本不需要)

kubectl get cs -o=go-template='{{printf "|NAME|STATUS|MESSAGE|\n"}}{{range .items}}{{$name := .metadata.name}}{{range .conditions}}{{printf "|%s|%s|%s|\n" $name .status .message}}{{end}}{{end}}'

attachments-2020-05-FrjY9Xhw5ec3779228674.png


查看node节点

# kubectl get nodes

attachments-2020-05-pIiu6pOI5ec377c2320c4.png

由于还没有安装网络  也没有添加node节点   因此只有一个master状态为 NotReady


安装Pod Network   ( master节点上安装   node节点加入集群会自动同步过去 )


为了让Pods间可以相互通信,我们必须安装一个网络插件,并且必须在部署任何应用之前安装

K8S的网络是以网络插件形式存在运行的,常用的是flannel 、Calico 、Weave等,CoreDNS也是在网络插件安装之后才会启动的


安装flannel:

# mkdir -p ~/k8s_flannel && cd ~/k8s_flannel

# wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml    //下载yml文件


修改kube-flannel.yml配置文件

# vim kube-flannel.yml

集群容器网段要与上面kubeadm的pod-network一致

attachments-2020-05-wPNjxCtQ5ec3783aaddb1.png


flanneld启动参数加上–-iface=<iface-name>  本例中的网卡为 eth0(单网卡可选 多个网卡需要指定网络接口否则nds可能会解析错误)

attachments-2020-05-RrRSjNK15ec378669eb36.png


启动flannel

# kubectl apply -f  kube-flannel.yml       启动flannel网络插件   (自动按照上面的配置文件下载相关镜像并运行)


attachments-2020-05-6ZoMTkUa5ec378b383e50.png


可以查看kube-flannel的镜像版本

# docker images

quay.io/coreos/flannel:v0.11.0-amd64

如果网络插件安装失败或者更换网络插件需要先删除

# kubectl delete -f ./kube-flannel.yml && rm -rf /etc/cni/net.d/*flannel*        

重新安装:kubectl apply -f ./kube-flannel.yml


检查flannel服务状态

# kubectl get pods -n kube-system -l app=flannel

attachments-2020-05-0EL1QkaG5ec3794a0ee78.png


检查各pod是否正常


# kubectl get pods -n kube-system   或者   # kubectl get pods --all-namespaces -o wide  或者 kubectl pods -A

attachments-2020-05-UY623HAm5ec3796990608.png

确保所有的Pod都处于Running状态


验正master节点已经就绪

# kubectl get nodes

attachments-2020-05-njXnELaU5ec379b89ba9b.png


Kubernetes集群中添加Node节点   (各Node上操作)


直接复制master生成的join信息

# kubeadm join 10.11.12.6:6443 --token 2r3suf.zutgcutjwnw4pze5 \--discovery-token-ca-cert-hash sha256:80bf791916b3356a25e25149a4fd4c47fa82a06fe52bcfdf4ec23f5f27bc064b

attachments-2020-05-OnQELIrZ5ec37a808e01b.png

如果加入集群超时或者失败需要重新join kubeadm reset && systemctl daemon-reload && systemctl restart kubelet


Master上再次查看集群状态

attachments-2020-05-9a8bZN3E5ec37acd6351e.png

再次查看所有 Pod 状态

# kubectl get pods --all-namespaces -o wide

attachments-2020-05-VfsBhoQn5ec37af04c029.png

kube-proxy开启ipvs   (修改master即可)k8s自身对于多个pod的负载均衡尽量采用ipvs lvs


修改ConfigMapkube-system/kube-proxy中的config.conf文件     填写mode: “ipvs”

# kubectl edit cm kube-proxy -n kube-system

attachments-2020-05-UDr9ygJm5ec37b2dac232.png

重启master节点上的kube-proxy pod

# kubectl get pod -n kube-system | grep kube-proxy | awk '{system("kubectl delete pod "$1" -n kube-system")}'

检查kube-proxy

# kubectl get pod -n kube-system | grep kube-proxy

attachments-2020-05-38zpaz7B5ec37b5a571c1.png

# kubectl logs kube-proxy-jllpr -n kube-system         查看其中一个的log     kube-proxy-jllprpods

attachments-2020-05-JzaT4p7Q5ec37b7696b34.png

日志中打印出了Using ipvs Proxier,说明ipvs模式已经开启


安装K8S控制面板Kuboard


master 节点上执行安装命令

# kubectl apply -f https://kuboard.cn/install-script/kuboard.yaml


查看 Kuboard 运行状态

# kubectl get pods -l k8s.eip.work/name=kuboard -n kube-system

attachments-2020-05-e4A01qsG5ec37ecb2b40b.png

获取Token


管理员用户 

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

attachments-2020-05-6hVutQF85ec37f02d8a36.png


访问Kuboard

 

通过NodePort方式:   Kuboard Service 使用了 NodePort 的方式暴露服务,NodePort 32567

http://任意一个Worker节点的IP地址:32567   (注意开启端口)

输入前一步骤中获得的 token,可进入 Kuboard 集群概览页

attachments-2020-05-6le1qowa5ec37f3003230.png

或者通过port-forward方式:# kubectl port-forward service/kuboard 8080:80 -n kube-system

在浏览器打开链接 (请使用 kubectl 所在机器的IP地址)

http://localhost:8080

输入前一步骤中获得的 token,可进入 Kuboard 集群概览页


进入可视化管理页面:


attachments-2020-05-XzEhoPkq5ec37f6a7211f.png

到此全部部署完毕


  • 发表于 2020-05-19 14:17
  • 阅读 ( 275 )
  • 分类:Kubenetes

0 条评论

请先 登录 后评论
zhik8sadm9
zhik8sadm9

运维工程师

11 篇文章

作家榜 »

  1. zhik8sadm9 11 文章
  2. hebergemWob 0 文章
  3. liangjj 0 文章
  4. Lai Wei 0 文章
  5. noveluser 0 文章
  6. z1x2c34 0 文章
  7. zhisongwu 0 文章
  8. tankerwng 0 文章