安装准备工作
- 安装环境要求:
角色 | 实验环境 | 生产环境 | 操作系统 |
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:应根据需要运行的容器数量进行配置; 以下环境配置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的防火墙
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的命名空间,显示如下:
- 安装K8s dashboard,kubernetes/dashboard =》https://github.com/kubernetes/dashboard
执行命令:
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}')
参考链接:
- 【基于Ubuntu 20.04安装Kubernetes 1.18】=》https://zhuanlan.zhihu.com/p/138554103
- 【ubuntu 安装 k8s】=》https://www.jianshu.com/p/f2d4dd4d1fb1
- 【Kubeadm安装k8s集群】=》https://kubernetes.io/docs/reference/setup-tools/kubeadm/
- 【在Ubuntu上安装Docker引擎】=》https://docs.docker.com/engine/install/ubuntu/
- 【Ubuntu20.04防火墙设置简易教程(小白)】=》https://www.jb51.net/article/192145.htm
- 【ubuntu关闭和开启防火墙】=》https://cloud.tencent.com/developer/article/1503910
- 【Ubuntu如何同步网络时间】=》https://www.cnblogs.com/zhongguiyao/p/9293764.html
- 【学习 Kubernetes 基础知识】=》https://kubernetes.io/zh/docs/tutorials/kubernetes-basics/
- 【k8s & docker 对应版本】=》https://github.com/kubernetes/kubernetes/releases
- 【k8s安装dashboard步骤】=》https://www.jianshu.com/p/073577bdec98