1 服务器配置

共使用3台服务器,依次配置hostname、固定IPhosts、防火墙、selinuxSwap

节点类型IPHOSTNAME
master10.10.10.117k8smaster.geoscene.cd
node-110.10.10.115k8snode1.geoscene.cd
node-210.10.10.116k8snode2.geoscene.cd

1.1 配置HOSTNAME

  • master服务器:hostnamectl --static set-hostname k8smaster.geoscene.cd
  • node-1服务器:hostnamectl --static set-hostname k8snode1.geoscene.cd
  • node-2服务器:hostnamectl --static set-hostname k8snode2.geoscene.cd

1.2 配置固定IP

编辑文件/etc/sysconfig/network-scripts/ifcfg-ens192,修改BOOTPROTO的值为static,并在文件追加:

IPADDR="10.10.10.117"
GATEWAY="10.10.10.1"
NETMASK="255.255.255.0"
DNS1="114.114.114.114"

为3台服务器配置对应固定IP,配置完成后,重启服务器。

使用命令ip addrping www.baidu.com验证固定IP配置是否成功。

1.3 配置HOSTS

配置每台服务器的host,让每台服务器可以使用域名互相访问。在每台服务器中执行:

cat << EOF >> /etc/hosts 
10.10.10.117 k8smaster.geoscene.cd
10.10.10.115 k8snode1.geoscene.cd
10.10.10.116 k8snode2.geoscene.cd
EOF

配置完成后,使用命令ping k8smaster.geoscene.cd验证配置是否成功。

1.4 配置防火墙

k8s集群需要打开多个端口,由于在内网中部署,暴力一点,关闭服务器防火墙

systemctl stop firewalld
systemctl disable firewalld

1.5 配置selinux

SELinux,安全增强型Linux,是一种采用安全架构的Linux系统。因为我们不是专业的Linux运维工程师,并且防止在后续部署过程中遇到因为SELinux产生的问题,这里直接关闭SELinux

  • 查看SELinux是否开启:执行命令/usr/sbin/sestatus -v,查看SELinux status的状态是否为enabled
  • 关闭SELinux:编辑文件vi /etc/selinux/config,设置SELINUXdisabled

1.6 配置Swap

k8s想法是将实例紧密包装到尽可能接近100%,所有的部署都应该与CPU、内存限制固定在一起。所以,如果调度程序发送一个Pod到一台机器,它不应该使用交换。同时,k8s的设计者考虑到性能的原因,关闭swap。如果在运行容器数量较多时,考虑节省资源的资源,可以添加kubelet参数--fail-swap-on=false来解决这个问题。

关闭Swap的步骤:

  • swapoff -a
  • 编辑/etc/fstab,注释swap所在的行

2 部署容器运行时

这里的容器运行时指的是:负责容器运行的软件,可选的有:containerddockerCRI-O,我们选择docker作为容器运行时。

配置k8s集群,需要为每个节点安装一个容器运行时,用来为Pod提供运行环境。

2.1 为容器进行时配置Cgroups

CgroupsLinux内核提供的一种可以限制单个进程或者多个进程所使用的资源的机制,可以对CPU、内存等资源实现精细化的控制。Docker就使用Cgroups来对CPU、内存等部分资源进行控制。

如果Linux系统发行版使用systemd来初始化系统时,初始化进程会生成并使用一个root控制组,充当cgroup管理器。这时systemdCgroups紧密集成,并将为每个systemd单位分配一个Cgroup。更多Cgroup的内容可查看这里

在安装容器运行时和kubelet时,可以为其指定一个Cgroups管理器,但k8s官网并不推荐这种配置,在资源压力下会变得不稳定。

容器运行时和kubelet以及systemd使用同一个Cgroups管理器,单个管理器会简化分配资源的视图,并且默认情况下对可用资源和使用的资源具有更一直的管理。

对于Docker容器运行时,可以设置native.cgroupdriver=system选项来配置。

2.2 安装Docker

需要在所有的服务器节点中安装Docker

  1. 安装所需包
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
  1. 新增Docker仓库
sudo yum-config-manager --add-repo \
  https://download.docker.com/linux/centos/docker-ce.repo
  1. 安装Docker CE
sudo yum update -y && sudo yum install -y \
  containerd.io-1.2.13 \
  docker-ce-19.03.11 \
  docker-ce-cli-19.03.11
  1. 配置Docker Daemon
## 创建/etc/docker目录
sudo mkdir /etc/docker

## 设置Docker Daemon
cat <<EOF | sudo tee /etc/docker/daemon.json
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2",
  "storage-opts": [
    "overlay2.override_kernel_check=true"
  ]
}
EOF
  1. 配置Docker开机启动
sudo mkdir -p /etc/systemd/system/docker.service.d
sudo systemctl daemon-reload
sudo systemctl restart docker
sudo systemctl enable docker

3 安装kubeadm、kubelet和kubectl

3.1 查看节点MAC地址和product_uuid的唯一性

  • 通过命令ifconfig -a查看网络的MAC地址,其中ether后面的为网卡的MAC地址
$ ifconfig -a
docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:b1:ea:dc:9b  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ens192: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.10.10.117  netmask 255.255.255.0  broadcast 10.10.10.255
        inet6 fe80::a3b1:f5:ed45:867d  prefixlen 64  scopeid 0x20<link>
        inet6 fe80::91b6:36c5:d7ee:7ae9  prefixlen 64  scopeid 0x20<link>
        inet6 fe80::60d1:71b4:d966:e79d  prefixlen 64  scopeid 0x20<link>
        ether 00:50:56:8c:00:10  txqueuelen 1000  (Ethernet)
        RX packets 193219  bytes 376026738 (358.6 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 179064  bytes 15122260 (14.4 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 64  bytes 5568 (5.4 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 64  bytes 5568 (5.4 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
  • 使用命令cat /sys/class/dmi/id/product_uuidproduct_uuid校验

正常情况,硬件设备的网络MAC地址和product_uuid都会有唯一值,但是虚拟机中可能会存在重复值。如果这两个配置不唯一,在安装kubeadm时可能会失败。

3.2 允许iptables检查桥接流量

使用命令lsmod | grep br_netfilter来查看br_netfilter模块是否被加载。如果该模块没有被加载,可执行sudo modprobe br_netfilter来加载该模块。

设置服务节点中给的sysctl配置中的net.bridge.bridge-nf-call-iptables值为1

$ cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF
$ cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
$ sudo sysctl --system

3.3 安装kubeadm、kubelet和kubectl

需要在每台服务器中安装:

  • kubeadm,用来初始化集群的指令
  • kubelet,在集群中的每个节点上用来启动Pod和容器等
  • kubectl,用来与集群通信的命令行工具

kubeadminkubeletkubectl需要单独安装,因此,需要确保他们的版本相匹配。关于版本的偏差可参考:

$ 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

# 将 SELinux 设置为 permissive 模式(相当于将其禁用)
$ setenforce 0
$ sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

$ yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes

$ systemctl enable --now kubelet

3.4 在控制平面节点(主节点)上配置kublet使用的cgroup管理器

如果使用Docker作为容器进行时kubeadm会自动为其监测cgroup驱动并在运行时对/var/lib/kubelet/kubeadm-flags.env文件进行配置。

如果使用CRI-O作为容器进行时,需要为kubeadm init传递cgroupdriver值。

这里我们使用Docker作为容器进行时,跳过这一步即可。

4 配置master节点

  1. k8smaster.geoscene.cd服务器中执行:
$ kubeadm init \
  --apiserver-advertise-address=10.10.10.117 \
  --image-repository registry.aliyuncs.com/google_containers \
  --service-cidr=10.96.0.0/12 \
  --pod-network-cidr=10.244.0.0/16

其中,

  • --apiserver-advertise-addressAPI服务器所公布的其正在监听的IP地址,如果没有设置,将会使用默认网络接口
  • --image-repository,拉取镜像的容器仓库
  • --service-cidr,为服务的虚拟IP地址另外指定的IP地址段,默认值为"10.96.0.0/12"
  • --pod-network-cidr, 指明 pod 网络可以使用的 IP 地址段。如果设置了这个参数,控制平面将会为每一个节点自动分配 CIDRs
  • 其他初始化选项可看这里

命令运行成功后需要记录返回信息的最后一行,即:kubeadm join 10.10.10.117:6443 --token **** --discovery-token-ca-cert-hash sha256:dd74bd1b52313dd8664b8147cb6d18a6f8b25c6c5aa4debc3,这条命令用来在工作节点中使用,将其添加到master节点中。

  1. 为用户设置权限
$ mkdir -p $HOME/.kube
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config
  1. 安装Pod网络插件
$ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

5 配置node节点

  1. node节点中执行命令,将node节点添加到master节点中
$ kubeadm join 10.10.10.117:6443 --token **** --discovery-token-ca-cert-hash sha256:dd74bd1b52313dd8664b8147cb6d18a6f8b25c6c5aa4debc3
  1. master节点中使用命令kubectl get nodes查看节点加载情况,刚刚加入的node节点的statusNOT Ready,需要等待7~8分钟左右才能变成Ready
$ kubectl get nodes
NAME                    STATUS   ROLES                  AGE   VERSION
k8smaster.geoscene.cd   Ready    control-plane,master   93m   v1.20.4
k8snode1.geoscene.cd    Ready    <none>                 88m   v1.20.4
k8snode2.geoscene.cd    Ready    <none>                 88m   v1.20.4

6 部署Dashboard

Dashboard是基于网页的K8S用户界面,展示了K8S集群中的资源状态信息和所有报错信息。部署K8S集群时,不会默认安装Dashboard,需要单独安装。

ui-dashboard

安装Dashboard也很简单,命令如下:

$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0/aio/deploy/recommended.yaml

Dashboard默认使用API Server的方式访问,访问起来很麻烦,访问URL一大串。可以把访问的方式改成NodePort,这样可以通过IP:PORT的方式来访问。

使用命令kubectl --namespace=kubernetes-dashboard edit service kubernetes-dashboard编辑Dashboard配置文件,将里面的type: ClusterIP改为type: NodePort

使用命令kubectl --namespace=kubernetes-dashboard get service kubernetes-dashboard查看Dashboard对外映射接口。

$ kubectl --namespace=kubernetes-dashboard get service kubernetes-dashboard
NAME                   TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)         AGE
kubernetes-dashboard   NodePort   10.104.86.86   <none>        443:32730/TCP   92m

这样在公司内网中就可以通过访问10.10.10.117:32730来访问Dashboard

7 创建管理员账号

默认访问Dashboard,会提示输入Token或者提供Kubeconfig文件来登录。需要为集群创建一个管理员账号,并生成Token来登录Dashboard

image-20210310162425632

$ kubectl create serviceaccount dashboard-admin -n kube-system
$ kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
$ kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')

可记录输出结果中的token信息,或者每次登录前执行最后一条命令来获取token

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐