使用 kubeadm 安装 Kubernetes 集群

安装准备工作

  • 安装环境要求:
角色 实验环境 生产环境 操作系统
master cpu/内存:2 Core/2G cpu/内存:2 Core/4G linux 内核4.4+
node cpu/内存:1 Core/2G cpu/内存:4 Core/16G linux 内核4.4+
备注

Node:应根据需要运行的容器数量进行配置;
Linux 操作系统基于x86_64架构的各种 Linux 发行版本,Kernel 版本要求在4.4及以上;【查看Linux内核:$ uname -f】

以下环境配置OS基于 Linux for ubuntu-server 20.04

Linux Kernel =》5.4.0-47-generic

查看linux内核版本=》https://www.linuxidc.com/Linux/2020-02/162345.htm

说明 以上为建议配置,实际安装过程中,Master必须2 core 及以上(否则安装失败,切记),Node可以采用1 core。
  •  单 Master 部署环境说明: 
主机 配置 组件 ip
k8s-master01

cpu/内存:2 Core/2G

硬盘:40GB

网络模式:桥接

kube-apiserver,

kube-controller-manager,kube-scheduler,

etcd

192.168.0.168
k8s-node01

cpu/内存:2 Core/2G

硬盘:40GB

网络模式:桥接

kubelet,

kube-proxy,

docker etcd

192.168.0.116
k8s-node02

cpu/内存:2 Core/2G

硬盘:40GB

网络模式:桥接

kubelet,

kube-proxy,

docker etcd

192.168.0.154
备注

linux 版本:ubuntu-20.04-live-server-amd64.iso

kubernetes 版本:v1.19.1

docker 版本:v19.03.8-ce

vm 版本:VMware Workstation Pro 15.6

客户端使用 xshell6 连接到 vm 中 linux 系统方便安装配置; 

说明

以上配置为3节点主机的单Master架构的最小规模集群配置,配置环境均在VM中部署安装,宿主机固定静态IP,保障vm中linux系统的网络在同一网段,使用桥接模式,宿主机和vm系统之间能相互通信,vm中系统能正常访问外网;

生产环境建议扩展多 Master 架构集群部署,node节点根据部署容器数量预估配置;

单 Master 架构图:

 操作系统初始化配置:

1.1 关闭 UFW(Uncomplicated Firewall)防火墙  

Ubuntu20.04一般都默认安装了UFW(Uncomplicated Firewall)防火墙服务,它是一款轻量化的工具,主要用于对输入输出的流量进行监控。而Kubernetes的Master与工作Node之间会有大量的网络通信,安全的做法是在防火墙上配置Kbernetes各组件(api-server、kubelet等等)需要相互通信的端口号。在安全的内部网络环境中可以关闭防火墙服务。

sudo ufw disable # 关闭ubuntu的防火墙

ubuntu关闭和开启防火墙

ubuntu20.04防火墙设置简易教程(小白)

1.2 关闭swap 内存分区

这个swap其实可以类比成 windows 上的虚拟内存,它可以让服务器在内存吃满的情况下可以保持低效运行,而不是直接卡死。但是 k8s 的较新版本都要求关闭swap,修改 /etc/fstab 文件:

sudo swapoff -a  # 临时
#修改/etc/fstab,注释掉swap那行,持久化生效
sudo vi /etc/fstab

1.3 根据规划设置主机名

hostname # 查看主机名称
hostnamectl set-hostname <hostname> # 设置主机名称

1.4 在Master 添加hosts

cat >> /etc/hosts << EOF
192.168.0.168 k8s-master01
192.168.0.116 k8s-node01
192.168.0.154 k8s-node02
EOF

 1.5 时间同步,确保时区和时间正确

每个宿主机上都要确保时区和时间是正确的。如果时区不正确,请使用下面的命令来修改:

sudo timedatectl set-timezone Asia/Shanghai

#修改后,如果想使得系统日志的时间戳也立即生效,则:
sudo systemctl restart rsyslog 

 (Ubuntu如何同步网络时间)装完Ubuntu设置完时间,重启总是恢复设置前的时间。
设定时区:dpkg-reconfigure tzdata
           选择Asia -> 再选择Shanghai -> OK

解决方法:

# 1.安装ntpdate工具
sudo apt-get install ntpdate 

# 2.将系统时间与网络同步
ntpdate cn.pool.ntp.org

# 3.将时间写入硬件
hwclock --systohc

# 4.查看时间是否已同步
date 

 1.6 关闭 suspend (待机/休眠),确保每个机器不会自动待机/休眠;

sudo systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target

1.7 设置iptables可以看到bridged traffic / 将桥接的IPv4流量传递到 iptables 的链

先确认Linux内核加载了br_netfilter模块:

lsmod | grep br_netfilter

确保sysctl配置中net.bridge.bridge-nf-call-iptables的值设置为了1。 

在Ubuntu 20.04 Server上,这个值就是1。如果你的系统上不一致,使用下面的命令来修改:

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 # 生效
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sudo sysctl --system  # 生效

1.8 设置rp_filter的值

因为K8s集群即将部署的是calico网络插件,而calico需要这个内核参数是0或者1,但是Ubuntu20.04上默认是2,这样就会导致calico插件报下面的错误(这是个fatal级别的error):

int_dataplane.go 1035: Kernel's RPF check is set to 'loose'.  \
This would allow endpoints to spoof their IP address.  \
Calico requires net.ipv4.conf.all.rp_filter to be set to 0 or 1. \
If you require loose RPF and you are not concerned about spoofing, \
this check can be disabled by setting the IgnoreLooseRPF configuration parameter to 'true'.

 使用下面的命令来修改这个参数的值:

# 修改/etc/sysctl.d/10-network-security.conf
sudo vi /etc/sysctl.d/10-network-security.conf

# 将下面两个参数的值从2修改为1
net.ipv4.conf.default.rp_filter=1
net.ipv4.conf.all.rp_filter=1

# 然后使之生效
sudo sysctl --system

1.9 重启系统

shutdown -r now #重启系统

开始安装基础软件

1,安装Docker

目前Ubuntu 20.04上没有docker官方提供的安装包,但是Ubuntu有,使用下面的命令来安装Docker;

# 安装docker
sudo apt update && sudo apt install docker.io

# 启动Docker,并设置为开机启动
sudo systemctl start docker && systemctl enable docker

 查看docker版本:

docker -v # 查看docker版本

注意:以上操作(除开1.4)均在所有节点执行;

开始安装 k8s

  • 安装K8s master;

以下的操作只在master宿主机上执行,适合中国大陆地区使用(因为弃用谷歌的源和repo,转而使用阿里云的镜像):

1、安装kubelet、 kubeadm 和 kubectl

sudo apt update && sudo apt install -y ca-certificates curl software-properties-common apt-transport-https curl
curl -s https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -

sudo tee /etc/apt/sources.list.d/kubernetes.list <<EOF 
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF

sudo apt update
sudo apt install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
  • kubelet 运行在 Cluster 所有节点上,负责启动 Pod 和容器;
  • kubeadm 用于初始化 Cluster ;
  • kubectl 是 k8s 命令行工具,通过 kubectl 可以部署和管理应用,查看各种资源,创建、删除和更新各种组件;

注意:在所有节点均安装 kubelet、 kubeadm 和 kubectl。

  2、初始化master

注意,这里使用了阿里云的镜像,然后使用了非默认的CIDR(一定要和宿主机的局域网的CIDR不一样!)

sudo kubeadm init --pod-network-cidr 172.16.0.0/16 \
    --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers

上面的命令执行成功后,会输出一条和kubeadm join相关的命令,后面加入worker node的时候要使用。

 输出其他节点加入master的命令:

Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

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

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 192.168.0.168:6443 --token cm1xr0.frcfjgtg0q4we4z0 \
    --discovery-token-ca-cert-hash sha256:80705f99840e6c80b46e5f1dead4f15a843f90514d3e9d2d449694c2a5eff6e1

 另外,给自己的非sudo的常规身份拷贝一个token,这样就可以执行kubectl命令了:

su chait # 切换到非管理员账户
#最后拷贝kubectl工具用的kubeconfig到默认路径下
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

 3、安装calico插件

下载calico的k8s yaml文件,修改里面的CALICO_IPV4POOL_CIDR的值来避免和宿主机所在的局域网段冲突(把原始的192.168.0.0/16 修改成了172.16.0.0/16):

# 下载 https://docs.projectcalico.org/v3.11/manifests/calico.yaml
sudo wget https://docs.projectcalico.org/v3.11/manifests/calico.yaml
# 修改CALICO_IPV4POOL_CIDR
root@k8s-master01:/# vim calico.yaml
# 通过文件名或控制台输入,对资源进行配置。
root@k8s-master01:/# kubectl apply -f calico.yaml

等待所有的pod都ready就绪。

  • 安装K8s worker节点;

在每个worker宿主机上,执行上面初始化master最后输出的命令,如下所示:

kubeadm join 192.168.0.168:6443 --token cm1xr0.frcfjgtg0q4we4z0 \
    --discovery-token-ca-cert-hash sha256:80705f99840e6c80b46e5f1dead4f15a843f90514d3e9d2d449694c2a5eff6e1

 接下来在 worker 节点输入命令=》【kubectl get pods】,结果出现如下错误:

The connection to the server localhost:8080 was refused - did you specify the right host or port?

 出现这个问题的原因是kubectl命令需要使用 kubernetes-admin 来运行,解决方法如下,将 Master 节点中的【/etc/kubernetes/admin.conf】文件拷贝到 worker 节点相同目录下,然后配置环境变量:

echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
source ~/.bash_profile # 立即生效

再次输入命令【kubectl get pods --all-namespaces】查看所有pod的命名空间,显示如下:

执行命令:

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

 以上方式启动 dashboard 访问会不太方便,可修改 yaml 中的 service 暴露端口方式,即可直接在浏览器访问;

kind: Service
apiVersion: v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard
spec:
  ports:
    - port: 17030
      targetPort: 8443
  type: NodePort
  externalIPs:
    - 192.168.0.168
  selector:
    k8s-app: kubernetes-dashboard

执行上面命令可能出现网络原因访问不起,可以 github 直接下载相应yaml文件设置;

 在需要部署的节点中安装文件传输工具:

$ sudo apt install lrzsz # 安装 rz 工具
$ rz # 选择上传的文件

 此时查看当前列表=》【ls】

此处 dashboard 本人是安装在 master 节点,安装信息如下:

  • 安装Ingress

此处我们使用 NGINX ingress controller 方式安装,更多的安装方式查看=》https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/ ;K8s官方支持和维护的是GCE和NGINX两种controller,执行如下命令:

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-0.32.0/deploy/static/provider/baremetal/deploy.yaml

上面方式可能存在网络访问失败的情况,此处安装的是【ingress-nginx】版本【v0.30.0】,ingress-controller.yaml 文件已经下载好,rz 上传到 worker 节点,如下所示:

最后我们来查看下单 Master 架构的3节点集群情况, 显示信息如下:

访问dashboard

  • 使用 kubectl proxy ;

启动成功后,可在内网节点的浏览器中访问 =》

http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/

vmware虚拟化节点访问 =》

curl http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/
  •  使用API Server

如果Kubernetes API服务器是公开的并且可从外部访问,就可以用API Server来访问 =》

https://<master-ip>:<apiserver-port>/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/

查看yaml文件对应的镜像版本

cat  kubernetes-dashboard.yaml|grep kubernetes-dashboard

有两种登录模式:Kubeconfig 和 Token;

此处我使用的是 Token 方式登陆,获取 Token =》 输入以下命令来创建用户token,利用token来登录dashboard:

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

参考链接:

猜你喜欢

转载自blog.csdn.net/ChaITSimpleLove/article/details/108553780