安装准备工作
说明:以下配置要求为开发环境部署最小规格,不建议生产环境按照此规格搭建部署环境。
- 安装环境要求
角色 | 实验环境 | 生产环境 | 操作系统 |
---|---|---|---|
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 内核版本=》在命令行中查看 Linux 内核版本的3种方法_Linux教程_Linux公社-Linux系统门户网站 |
||
说明 | 以上为建议配置,实际安装过程中,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 架构图
操作系统初始化配置
2.1 关闭 UFW(Uncomplicated Firewall)防火墙
Ubuntu20.04
一般都默认安装了 UFW(Uncomplicated Firewall)
防火墙服务,它是一款轻量化的工具,主要用于对输入输出的流量进行监控。而 Kubernetes
的 Master
与工作 Node
之间会有大量的网络通信,安全的做法是在防火墙上配置 Kbernetes
各组件(api-server、kubelet
等等)需要相互通信的端口号。在安全的内部网络环境中可以关闭防火墙服务。
# 查看防火墙状态
$ sudo ufw status verbose
# 关闭ubuntu的防火墙
$ sudo ufw disable
- Status: inactive 说明防火墙未运行
- Status: active 说明防火墙在运行
参考:
- ubuntu 关闭和开启防火墙,https://cloud.tencent.com/developer/article/1503910
- ubuntu20.04 防火墙设置简易教程(小白),https://www.jb51.net/article/192145.htm
2.2 关闭 SELinux
安全增强型 Linux(Security-Enhanced Linux)
简称 SELinux
,它是一个 Linux
内核模块,也是 Linux
的一个安全子系统。
SELinux
主要由美国国家安全局开发。2.6
及以上版本的Linux
内核都已经集成了SELinux
模块。SELinux
的结构及配置非常复杂,而且有大量概念性的东西,要学精难度较大。很多 Linux 系统管理员嫌麻烦都把SELinux
关闭了。
关闭 SELinux
的两种方法
- 永久方法 – 需要重启服务器
修改 /etc/selinux/config
文件中设置 SELINUX=disabled
,然后重启服务器。
- 临时方法 – 设置系统参数
使用命令 setenforce 0
参数说明:
- setenforce 1 设置 SELinux 成为 enforcing 模式
- setenforce 0 设置 SELinux 成为 permissive 模式
# 安装 selinux-utils
$ apt install selinux-utils
# 查看 selinux 是否关闭
$ getenforce
# 临时
$ setenforce 0
# 永久
$ sed -i 's/enforcing/disabled/' /etc/selinux/config
2.3 关闭 swap
内存分区
这个 swap
其实可以类比成 windows
上的虚拟内存,它可以让服务器在内存吃满的情况下可以保持低效运行,而不是直接卡死。但是 k8s
的较新版本都要求关闭 swap
,修改 /etc/fstab
文件:
# 临时
$ sudo swapoff -a
# 永久,修改/etc/fstab,注释掉swap那行,持久化生效
$ sudo vi /etc/fstab
2.4 根据规划设置主机名
# 查看主机名称
$ hostname
# 设置主机名称
$ hostnamectl set-hostname <hostname>
2.5 在 Master
添加 hosts
hosts
文件的作用相当如 DNS(Domain Name System)
,提供 IP
地址到 hostname
的映射。早期的互联网计算机少,单机 hosts
文件里足够存放所有联网计算机。不过随着互联网的发展,这就远远不够了。于是就出现了分布式的 DNS
系统。由 DNS
服务器来提供类似的 IP
地址到域名的对应。具体可以 man hosts
。/etc/hosts
中包含了 IP
地址和主机名之间的映射,还包括主机名的别名。
hosts
文件的配置格式是: IP FQDN alias
,其中全域名 (FQDN,Fully Qualified Domain Name)
是指主机名加上全路径,全路径中列出了序列中所有域成员。全域名可以从逻辑上准确地表示出主机在什么地方,也可以说全域名是主机名的一种完全表示形式。从全域名中包含的信息可以看出主机在域名树中的位置。
Linux
系统在向 DNS
服务器发出域名解析请求之前会查询 /etc/hosts
文件,如果里面有相应的记录,就会使用 hosts
里面的记录。
此处 hosts
类似 DNS(Domain Name System)
, DNS
可以降低延迟,但是不能提高上下行网速。
$ cat >> /etc/hosts << EOF
172.26.16.100 k8s-master01
172.26.16.101 k8s-node01
172.26.16.102 k8s-node02
EOF
注意:此处添加 hosts 防止重启 linux 系统后,IP 无效,可以事先根据规划的网段设置好静态IP地址,操作如下:Ubuntu 18.04 配置静态IP地址。
使用 Netplan
(新一代网络配置工具)工具配置网络
1. 备份系统默认 /etc/netplan/*.yaml
文件
$ sudo cp /etc/netplan/00-installer-config.yaml /etc/netplan/00-installer-config.yaml.bak
2. 编写 /etc/netplan/*.yaml
文件
network:
version: 2
renderer: networkd
ethernets:
eth0: #配置的网卡名称
dhcp4: false #dhcp4关闭
dhcp6: false #dhcp6关闭
addresses: [172.26.16.100/16] #设置本机IP及掩码
gateway4: 172.26.16.1 #设置网关
nameservers:
addresses: [114.114.114.114, 8.8.8.8] #设置DNS
- eth0 - 网络接口名称。
- dhcp4 和 dhcp6 - 接受 IPv4 和 IPv6 接口的 dhcp 属性。
- addresses - 接口的静态地址序列。
- gateway4 - 默认网关的 IPv4 地址。
- nameservers - nameservers 的 IP 地址序列。
DNS 可以配置多个,配置列表见附件。
IP 地址段和子网掩码对照表 =》
- 精心整理IP地址段与子网掩码表(收藏) (360doc.com),http://www.360doc.com/content/18/0121/21/40298311_723964860.shtml
- IP和子网掩码对照表 - 百度文库 (baidu.com),https://wenku.baidu.com/view/aec639e0a1116c175f0e7cd184254b35eefd1ad8.html
3. 执行 apply
命令,使 yaml
配置生效
$ netplan apply -f 00-installer-config.yaml
附:国内知名公共DNS服务器IP
- 腾讯DNS:119.29.29.29、 182.254.116.116
- 阿里DNS:223.5.5.5、 223.6.6.6
- 百度DNS:180.76.76.76
- 114DNS:114.114.114.114、 114.114.115.115
- CNNIC DNS:1.2.4.8、 210.2.4.8
- OneDNS:117.50.11.11、 117.50.22.22
- Hi!XNS DNS服务器:40.73.101.101
- 清华大学TUNA协会DNS服务器:101.6.6.6
- Google Public DNS:8.8.8.8、8.8.4.4
2.6 时间同步,确保时区和时间正确
每个宿主机上都要确保时区和时间是正确的。如果时区不正确,请使用下面的命令来修改:
$ sudo timedatectl set-timezone Asia/Shanghai
#修改后,如果想使得系统日志的时间戳也立即生效,则:
$ sudo systemctl restart rsyslog
(Ubuntu如何同步网络时间,https://www.cnblogs.com/zhongguiyao/p/9293764.html)装完Ubuntu设置完时间,重启总是恢复设置前的时间。
- 设定时区:dpkg-reconfigure tzdata
- 选择Asia -> 再选择Shanghai -> OK
解决方法:
# 1.安装ntpdate工具
$ sudo apt install ntpdate -y
# 2.将系统时间与网络同步
$ ntpdate cn.pool.ntp.org
# 3.将时间写入硬件
$ hwclock --systohc
# 4.查看时间是否已同步
$ date
2.7 关闭 suspend
(待机/休眠),确保每个机器不会自动待机/休眠;
$ sudo systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target
2.8 设置 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 # 生效
2.9 设置 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
2.10 重启 Linux
系统
$ shutdown -r now #重启系统
安装基础软件
Kubernetes
在 1.20.x
版本以前默认 CRI/Container Runtime Interface
(容器运行时)为 Docker
,因此此处先安装 Docker
;
关于 CRI
的一些实现:
CRI-containerd
是目前社区中比较主流的新一代CRI
的实现;CRI-O
来自于红帽公司基于Open Container Initiative
的K8s CRI
的实现;PouchContainer
是由alibaba
实现的CRI
;- 其它的
CRI
实现,这里就不一一介绍了,更多详细信息自行查阅资料。
注意:Kubernetes
官方发布公告,宣布自v1.20
起放弃对Docker
的支持,届时用户将收到Docker
弃用警告,并需要改用其他容器运行时。目前k8s
最新版默认容器运行时是CRI-containerd
。
3.1 安装 Docker
目前 Ubuntu 20.04
上没有 docker
官方提供的安装包,但是 Ubuntu
有,使用下面的命令来安装 Docker
;
1. apt
方式安装 docker
# 安装 Docker
$ sudo apt update && sudo apt install docker.io
# 启动 Docker,并设置为开机启动
$ sudo systemctl start docker && systemctl enable docker
注意:apt
方式安装docker
,daemon.json
文件的位置在/etc/docker/
文件下面。
2. snap
方式安装 docker
# 安装 docker
$ sudo snap install docker
# 启动 docker
$ sudo snap start docker
注意:snap
方式安装docker,daemon.json
文件的位置在/var/snap/docker/*/config/
文件下面。
参考:Ubuntu 20.04 以 snap 的方式安装 Docker,https://www.cnblogs.com/jijizhazha/p/13170711.html
3.2 验证 Docker
是否安装成功
$ docker -v # 查看docker版本
3.3 配置 Docker 镜像下载加速器
$ cat > /etc/docker/daemon.json << EOF
{
"registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"]
}
EOF
$ systemctl restart docker
$ docker info
国内从 Docker Hub
拉取镜像有时会遇到困难,此时可以配置镜像加速器。Docker
官方和国内很多云服务商都提供了国内加速器服务,例如:
- 中国科技大学镜像:https://docker.mirrors.ustc.edu.cn/
- 网易镜像:https://hub-mirror.c.163.com/
- 阿里云镜像:https://<你的ID>.mirror.aliyuncs.com/
- 七牛云加速器:https://reg-mirror.qiniu.com/
- Docker中国区官方镜像:https://registry.docker-cn.com/
- ustc: https://docker.mirrors.ustc.edu.cn/
3.4 在 Ubuntu
系统中配置阿里云 apt
软件源
#第一步:备份源文件:
$ sudo cp /etc/apt/sources.list /etc/apt/sources.list.backup
#第二步:编辑 `/etc/apt/sources.list` 文件
#在文件最前面添加以下条目(操作前请做好相应备份):
$ vi /etc/apt/sources.list
# 阿里云 apt 源
# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
#deb-src http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
#deb-src http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
#deb-src http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
#deb-src http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
# 预发布软件源,不建议启用
#deb http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse
#deb-src http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse
#第三步:执行更新命令:
$ sudo apt-get update
$ sudo apt-get upgrade
其中 3.4 参考如下:
Ubuntu
系统配置源并安装,https://www.cnblogs.com/zqifa/p/12910989.htmlLinux
发行版添加软件源,https://developer.aliyun.com/article/746822?spm=a2c6h.13813017.content3.1.7afe1211cFoJxx- 基于
Debian
的发行版,https://kubernetes.io/zh-cn/docs/setup/production-environment/tools/kubeadm/install-kubeadm/#%E5%AE%89%E8%A3%85-kubeadm-kubelet-%E5%92%8C-kubectl
#1.查看 docker 服务是否开机启动
$ sudo systemctl list-unit-files | grep enable|grep docker
snap-docker-1125.mount enabled
snap.docker.dockerd.service enabled
#2.关闭 docker 开机自启动
$ systemctl disable snap.docker.dockerd.service
Removed /etc/systemd/system/multi-user.target.wants/snap.docker.dockerd.service.
#3.开启 docker 开机自启动
$ systemctl enable snap.docker.dockerd.service
#4.关闭 docker 服务
$ systemctl stop snap.docker.dockerd.service
#5.启动 docker 服务
$ systemctl start snap.docker.dockerd.service
#6.查看 docker 服务是否启动
$ sudo systemctl list-units --type=service|grep docker
snap.docker.dockerd.service loaded active running Service for snap application docker.dockerd
注意:以上操作(除开2.4、2.5)均在所有节点执行;
开始安装 k8s
4.1 安装 K8s master
以下的操作只在 master
宿主机上执行,适合中国大陆地区使用(因为弃用谷歌的源和 repo
,转而使用阿里云的镜像):
4.1.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
# 查看 kubeadm 可用版本
$ sudo apt-cache madison kubeadm
# 指定 kubeadm 版本安装
$ sudo apt install -y kubelet=1.22.1-00 kubeadm=1.22.1-00 kubectl=1.22.1-00
$ sudo apt-mark hold kubelet=1.22.1-00 kubeadm=1.22.1-00 kubectl=1.22.1-00
- kubelet 运行在 Cluster 所有节点上,负责启动 Pod 和容器;
- kubeadm 用于初始化 Cluster ;
- kubectl 是 k8s 命令行工具,通过 kubectl 可以部署和管理应用,查看各种资源,创建、删除和更新各种组件;
注意:在所有节点均安装 kubelet、 kubeadm 和 kubectl。
4.1.2 初始化 Kubernetes Master
注意:这里使用了阿里云的镜像,然后使用了非默认的 CIDR(一定要和宿主机的局域网的 CIDR 不一样!)
=》4.1.2.1 命令初始化
$ kubeadm init \
--apiserver-advertise-address=172.26.16.100 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.18.0 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16 \
--ignore-preflight-errors=all
# 或者 --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers
命令参数说明:
- 【--apiserver-advertise-address】集群通告地址;
- 【--image-repository】由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址;
- 【--kubernetes-version】K8s版本,与上面安装的一致;
- 【--service-cidr】集群内部虚拟网络,Pod统一访问入口;
- 【--pod-network-cidr】Pod网络与下面部署的 CNI 网络组件 yaml 中保持一致;
- 【--ignore-preflight-errors】忽略预检查错误信息,这个参数会跳过对docker-ce的版本检查;
=》4.1.2.2 yaml
配置文件引导初始化
# 编辑配置文件
$ vi kubeadm.conf
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
kubernetesVersion: v1.18.0
imageRepository: registry.aliyuncs.com/google_containers
networking:
podSubnet: 10.244.0.0/16
serviceSubnet: 10.96.0.0/12
#执行并应用配置文件
$ kubeadm init --config kubeadm.conf --ignore-preflight-errors=all
4.2 加入 Kubernetes Node
(部署 K8s worker
节点)
上面的命令执行成功后,会输出一条和 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
拷贝 kubectl 使用的连接k8s认证文件到默认路径
,给自己的非 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
# 查看集群节点信息
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master Ready master 2m v1.18.0
在每个 node/worker
宿主机上,执行上面初始化 master
最后输出的命令,如下所示:
kubeadm join 192.168.0.168:6443 --token cm1xr0.frcfjgtg0q4we4z0 \
--discovery-token-ca-cert-hash sha256:80705f99840e6c80b46e5f1dead4f15a843f90514d3e9d2d449694c2a5eff6e1
接下来在 node/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
的命名空间,显示如下:
默认 token
有效期为 24 小时,当过期之后,该 token
就不可用了。这时就需要重新创建 token
,操作如下:
$ kubeadm token create
$ kubeadm token list
$ openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
80705f99840e6c80b46e5f1dead4f15a843f90514d3e9d2d449694c2a5eff6e1
$ kubeadm join 192.168.31.61:6443 --token nuja6n.o3jrhsffiqs9swnu --discovery-token-ca-cert-hash sha256:80705f99840e6c80b46e5f1dead4f15a843f90514d3e9d2d449694c2a5eff6e1
命令:kubeadm token create --print-join-command
参考地址 =》https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm-join/
4.3 部署容器网络(CNI)
Calico
是一个纯三层的数据中心网络方案,Calico
支持广泛的平台,包括Kubernetes、OpenStack
等。Calico
在每一个计算节点利用Linux Kernel
实现了一个高效的虚拟路由器(vRouter
) 来负责数据转发,而每个vRouter
通过BGP
协议负责把自己上运行的workload
的路由信息向整个Calico
网络内传播。- 此外,
Calico
项目还实现了Kubernetes
网络策略,提供ACL
功能。
=》 Quickstart for Calico on Kubernetes
,https://docs.projectcalico.org/getting-started/kubernetes/quickstart
4.3.1 安装 calico
插件
下载 calico
的 k8s yaml
文件
# 下载 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
网络(CALICO_IPV4POOL_CIDR
),与前面pod CIDR
配置一样; - 选择工作模式(
CALICO_IPV4POOL_IPIP
),支持BGP(Never)、IPIP(Always)、CrossSubnet
(开启BGP
并支持跨子网);
修改里面的 CALICO_IPV4POOL_CIDR
的值来避免和宿主机所在的局域网段冲突(把原始的192.168.0.0/16
修改成了 172.16.0.0/16
):
修改完后应用清单:
等待所有的 pod
都 ready
就绪。
4.4 测试 K8s
集群环境
- 验证Pod工作;
- 验证Pod网络通信;
- 验证DNS解析;
在 Kubernetes
集群中创建一个 pod
,验证是否正常运行:
$ kubectl create deployment nginx --image=nginx
$ kubectl expose deployment nginx --port=80 --type=NodePort
$ kubectl get pod,svc
访问地址:http://NodeIP:Port
4.5 部署 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
访问会不太方便,只能在集群内部(cluster-ip
)访问,可修改 yaml
中的 service
暴露端口方式为 NodePort
类型,即可直接在浏览器中访问;
$ vi recommended.yaml
...
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
...
$ kubectl apply -f recommended.yaml
$ kubectl get pods -n kubernetes-dashboard
NAME READY STATUS RESTARTS AGE
dashboard-metrics-scraper-6b4884c9d5-gl8nr 1/1 Running 0 13m
kubernetes-dashboard-7f99b75bf4-89cds 1/1 Running 0 13m
执行上面命令可能出现网络原因访问不起,可以 github
直接下载相应 yaml
文件设置;
在需要部署的节点中安装文件传输工具:
$ sudo apt install lrzsz # 安装 rz 工具
$ rz # 选择上传的文件
此时查看当前列表=》【ls】
此处 dashboard
本人是安装在 master
节点,安装信息如下:
访问地址:https://NodeIP:30001
创建 service account
并绑定默认 cluster-admin
管理员集群角色:
# 创建用户
$ kubectl create serviceaccount dashboard-admin -n kube-system
# 用户授权
$ kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
# 获取用户Token
$ kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')
使用输出的 token
登录 Dashboard
。
4.6 安装 Ingress
此处我们使用 NGINX ingress controller
方式安装,更多的安装方式查看=》(Ingress Controllers | Kubernetes,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
节点,如下所示:
最后我们来查看下 1 Master
架构的 3 node
集群情况, 显示信息如下:
4.7 访问 Dashboard
4.7.1 使用 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/
4.7.2 使用 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
4.7.3 两种登录模式 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}')