本文主要对使用kubeadm部署Kubernetes集群进行总结。使用三台虚拟机来部署一个单Master节点的Kubernetes集群,Kubernetes版本选择的是v1.18.5
。
一、部署要求
1.部署集群的机器的要求
- 需要一台或多台运行着下列系统的机器:
- Ubuntu 16.04+
- Debian 9+
- CentOS 7+
- Red Hat Enterprise Linux (RHEL) 7
- Fedora 25+
- HypriotOS v1.0.1+
- Container Linux (测试 1800.6.0 版本)
- 每台机器至少2GB内存
- 每台机器至少2核CPU
- 集群中的所有机器的网络彼此均能相互连接(公网和内网都可以)
- 确保每个节点上的主机名、MAC地址和product_uuid的唯一性
- 开启机器上的某些端口
- 禁用交换(swap)分区
2.检查所需端口
控制平面节点:
协议 | 方向 | 端口范围 | 作用 | 使用者 |
---|---|---|---|---|
TCP | 入站 | 6443* | Kubernetes API服务器 | 所有组件 |
TCP | 入站 | 2379-2380 | etcd server client API | kube-apiserver,etcd |
TCP | 入站 | 10250 | Kubelet API | kubelet自身、控制平面组件 |
TCP | 入站 | 10251 | kube-scheduler | kube-scheduler自身 |
TCP | 入站 | 10252 | kube-controller-manager | kube-controller-manager自身 |
工作节点:
协议 | 方向 | 端口范围 | 作用 | 使用者 |
---|---|---|---|---|
TCP | 入站 | 10250 | Kubelet API | kubelet自身、控制平面组件 |
TCP | 入站 | 30000-32767 | NodePort服务 | 所有组件 |
注意事项:
- 使用
*
标记的任意端口号都可以被覆盖,所以需要保证所定制的端口是开放的。 - 虽然控制平面节点已经包含了etcd的端口,但也可以使用自定义的外部etcd集群或是指定自定义端口。
- pod网络插件也可能需要开启某些特定端口。由于每个pod网络插件需开启的端口都有所不同,可以参阅他们的官方文档中对端口的要求。
二、环境信息
准备三台网络互通并能上外网的主机,这里使用的是三台虚拟机。本文所使用的环境如下:
主机名 | ip | 操作系统 | Docker | kubernetes | kubeadm | kubectl | kubelet | flannel | 配置 | 备注 |
---|---|---|---|---|---|---|---|---|---|---|
k8s-master | 192.168.1.16 | CentOS Linux release 8.2.2004 | 19.03.12 | v1.18.5 | 1.18.5 | 1.18.5 | 1.18.5 | v0.12.0-amd64 | 4C4G | k8s控制平面节点(control plane) |
k8s-node1 | 192.168.1.17 | CentOS Linux release 8.2.2004 | 19.03.12 | v1.18.5 | 1.18.5 | 1.18.5 | 1.18.5 | / | 4C4G | k8s工作节点(worker node) |
k8s-node2 | 192.168.1.18 | CentOS Linux release 8.2.2004 | 19.03.12 | v1.18.5 | 1.18.5 | 1.18.5 | 1.18.5 | / | 4C2G | k8s工作节点(worker node) |
三、系统准备
除特殊说明的地方外,在control plane和work节点都执行本部分操作。
1.验证mac地址和uuid
cat /sys/class/net/ens160/address
cat /sys/class/dmi/id/product_uuid
k8s-master
主机:
k8s-node1
主机:
k8s-node2
主机:
各节点mac和uuid唯一。
2.配置主机名
设置主机名:
hostnamectl set-hostname <hostname>
退出重新登陆即可显示新设置的主机名。下面修改hosts
文件:
cat >> /etc/hosts << EOF
192.168.1.16 k8s-master
192.168.1.17 k8s-node1
192.168.1.18 k8s-node2
EOF
3.添加阿里源
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak
yum install -y wget
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-8.repo
4.关闭防火墙
systemctl stop firewalld && systemctl disable firewalld
5.禁用swap
临时禁用:
swapoff -a
永久禁需要在临时禁用后修改配置文件/etc/fstab
,注释swap:
sed -i.bak '/swap/s/^/#/' /etc/fstab
已禁用:
6.关闭selinux
临时关闭:
setenforce 0
永久关闭需将SELinux设置为disabled:
sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config
重启系统,查看SELinux配置,成功关闭:
7.设置系统时区和同步时间
设置系统时区为亚洲/上海,如果安装时设置过,则跳过:
timedatectl set-timezone Asia/Shanghai
如未安装chrony,执行以下命令安装
yum install -y chrony
时间同步:
systemctl enable --now chronyd
查看同步状态:
timedatectl status
System clock synchronized: yes
表示时钟已同步,NTP service: active
表示开启了时钟同步服务:
将当前的UTC 时间写入硬件时钟:
timedatectl set-local-rtc 0
重启依赖于系统时间的服务:
systemctl restart rsyslog && systemctl restart crond
8.修改内核参数
在修改下面的内核参数之前需确保加载了br_netfilter
模块。执行以下命令查看br_netfilter
模块:
lsmod | grep br_netfilter
如果系统没有br_netfilter
模块则执行下面的新增br_netfilter
模块的命令,有则跳过。执行以下命令临时新增br_netfilter
模块:
modprobe br_netfilter
该方式重启后会失效。想要永久新增br_netfilter
模块需执行以下命令:
cat > /etc/rc.sysinit << EOF
#!/bin/bash
for file in /etc/sysconfig/modules/*.modules ; do
[ -x $file ] && $file
done
EOF
cat > /etc/sysconfig/modules/br_netfilter.modules << EOF
modprobe br_netfilter
EOF
chmod 755 /etc/sysconfig/modules/br_netfilter.modules
重启后不会失效,永久新增了br_netfilter
模块。然后添加需要的内核参数,临时新增以下内核参数:
sysctl net.bridge.bridge-nf-call-iptables=1
sysctl net.bridge.bridge-nf-call-ip6tables=1
sysctl net.ipv4.ip_forward=1
永久新增以下内核参数:
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
sysctl --system
新增内核参数刷新生效:
验证是否生效:
sysctl -n net.bridge.bridge-nf-call-ip6tables
sysctl -n net.bridge.bridge-nf-call-iptables
sysctl -n net.ipv4.ip_forward
重启系统后验证是否生效,返回1
表示生效:
9.kube-proxy开启ipvs的前置条件
由于k8s已经支持了ipvs,为了kube-proxy开启ipvs需要加载以下模块,执行以下命令:
cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4
查看是否已经正确加载所需的内核模块:
lsmod | grep -e ipvs -e nf_conntrack_ipv4
所需模块已加载:
安装ipset软件包和管理工具ipvsadm:
yum install -y ipset ipvsadm
10.免密登录
配置k8s-master主机到k8s-node1和k8s-node2主机的免密登录,本步骤只在k8s-master
上执行。首先创建秘钥:
ssh-keygen -t rsa
将公钥同步至k8s-node1
和k8s-node2
:
ssh-copy-id -i ~/.ssh/id_rsa.pub root@k8s-node1
ssh-copy-id -i ~/.ssh/id_rsa.pub root@k8s-node2
免密登录:
ssh root@k8s-node1
ssh root@k8s-node2
四、安装配置Docker
在control plane和work节点都执行本部分操作。
1.安装Docker
安装19.03.12
版本的Docker:
sudo yum update -y \
&& sudo yum install -y yum-utils device-mapper-persistent-data lvm2 \
&& sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo \
&& yum install -y https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/edge/Packages/containerd.io-1.2.13-3.2.el7.x86_64.rpm \
&& sudo yum install -y docker-ce-19.03.12 \
&& sudo systemctl start docker \
&& sudo systemctl enable docker
2.命令补全
安装bash-completion:
yum install -y bash-completion
加载bash-completion:
source /etc/profile.d/bash_completion.sh
3.加入用户组
root用户可跳过,非root用户执行以下命令加入docker
用户组:
sudo usermod -aG docker $USER
newgrp docker
4.配置Docker
如下配置Docker:
cat > /etc/docker/daemon.json << EOF
{
"registry-mirrors": ["https://ncq2ty7z.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
}
}
EOF
重新加载配置并重启Docker:
sudo systemctl daemon-reload && sudo systemctl restart docker
5.验证
验证Docker是否安装启动成功:
docker version
docker -v
systemctl status docker
安装成功:
启动成功:
五、安装kubeadm、kubelet和kubectl
在control plane和work节点都执行本部分操作。
1.添加阿里kubernetes源
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=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
[]
:中括号中是repository的id,唯一,用来标识不同仓库。name
:仓库名称。baseurl
:仓库地址。enable
:是否启用该仓库,默认为1表示启用。gpgcheck
:是否验证从该仓库获得程序包的合法性,1为验证。repo_gpgcheck
:是否验证元数据的合法性,1为验证。gpgkey
:数字签名的公钥所在位置,如果gpgcheck
值为1,此处就需要指定gpgkey
文件的位置,如果gpgcheck
值为0就不需要此项了。
2.安装kubeadm、kubelet和kubectl
执行以下命令安装1.18.5
版kubeadm、kubelet和kubectl:
yum install -y kubeadm-1.18.5 kubelet-1.18.5 kubectl-1.18.5
设置kubelet开机自启:
systemctl enable kubelet
3.kubectl命令补全
echo "source <(kubectl completion bash)" >> ~/.bash_profile
source .bash_profile
到这里可以拷贝一份虚拟机镜像保存,便于部署k8s集群。
六、初始化主节点
除特殊说明的地方外,在k8s-master
节点执行本部分操作。
1.拉取镜像
准备了科学上网可略过此步骤。由于国内网络原因,如果没有科学上网则无法直接从k8s.gcr.io拉取镜像。最简单的方式是初始化时通过
--image-repository registry.aliyuncs.com/google_container
指定阿里云镜像仓库,但是阿里云仓库暂时只更新到v1.18.3版本,指定阿里云仓库暂时只能使用v1.18.3及以下版本。本文使用v1.18.5版本,所以需要从国内镜像库或Docker Hub用户仓库提前拉取。
查看指定k8s版本需要的镜像:
kubeadm config images list --kubernetes-version v1.18.5
创建一个k8s目录并新建一个脚本:
mkdir -p /usr/local/k8s
vi /usr/local/k8s/k8s-images.sh
脚本内容如下:
#!/bin/bash
# 拉取镜像并打标签
KUBE_VERSION=v1.18.5
PAUSE_VERSION=3.2
ETCD_VERSION=3.4.3-0
COREDNS_VERSION=1.6.7
# 拉取镜像
docker pull kubeimage/kube-apiserver-amd64:$KUBE_VERSION
docker pull kubeimage/kube-controller-manager-amd64:$KUBE_VERSION
docker pull kubeimage/kube-scheduler-amd64:$KUBE_VERSION
docker pull kubeimage/kube-proxy-amd64:$KUBE_VERSION
docker pull registry.aliyuncs.com/google_containers/pause:$PAUSE_VERSION
docker pull registry.aliyuncs.com/google_containers/etcd:$ETCD_VERSION
docker pull registry.aliyuncs.com/google_containers/coredns:$COREDNS_VERSION
# 标签打上k8s.gcr.io前缀
docker tag kubeimage/kube-apiserver-amd64:$KUBE_VERSION k8s.gcr.io/kube-apiserver:$KUBE_VERSION
docker tag kubeimage/kube-controller-manager-amd64:$KUBE_VERSION k8s.gcr.io/kube-controller-manager:$KUBE_VERSION
docker tag kubeimage/kube-scheduler-amd64:$KUBE_VERSION k8s.gcr.io/kube-scheduler:$KUBE_VERSION
docker tag kubeimage/kube-proxy-amd64:$KUBE_VERSION k8s.gcr.io/kube-proxy:$KUBE_VERSION
docker tag registry.aliyuncs.com/google_containers/pause:$PAUSE_VERSION k8s.gcr.io/pause:$PAUSE_VERSION
docker tag registry.aliyuncs.com/google_containers/etcd:$ETCD_VERSION k8s.gcr.io/etcd:$ETCD_VERSION
docker tag registry.aliyuncs.com/google_containers/coredns:$COREDNS_VERSION k8s.gcr.io/coredns:$COREDNS_VERSION
# 删除打标签之前拉取的镜像
docker rmi kubeimage/kube-apiserver-amd64:$KUBE_VERSION
docker rmi kubeimage/kube-controller-manager-amd64:$KUBE_VERSION
docker rmi kubeimage/kube-scheduler-amd64:$KUBE_VERSION
docker rmi kubeimage/kube-proxy-amd64:$KUBE_VERSION
docker rmi registry.aliyuncs.com/google_containers/pause:$PAUSE_VERSION
docker rmi registry.aliyuncs.com/google_containers/etcd:$ETCD_VERSION
docker rmi registry.aliyuncs.com/google_containers/coredns:$COREDNS_VERSION
添加755权限并执行:
chmod 755 /usr/local/k8s/k8s-images.sh && /usr/local/k8s/k8s-images.sh
查看镜像:
2.初始化k8s-master
kubeadm init \
--apiserver-advertise-address=192.168.1.16 \
--kubernetes-version v1.18.5 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16
--apiserver-advertise-address
:指定与集群的其他节点通信的master的IP地址。--service-cidr
:指定Service网络的范围,即负载均衡使用的IP地址段。--pod-network-cidr
:指定Pod网络的范围,即Pod的IP地址段,使用flannel需指定为10.244.0.0/16
。--kubernetes-version
:指定kubernetes的版本号。
初始化过程的输出如下:
输出内容主要有以下关键信息:
[init]
:指定版本进行初始化操作。[preflight]
:初始化前的检查和下载所需要的Docker镜像文件。[kubelet-start]
:生成kubelet的配置文件/var/lib/kubelet/config.yaml
,没有这个文件kubelet无法启动,所以初始化之前的kubelet启动会失败。[certs]
:生成Kubernetes使用的证书,存放在/etc/kubernetes/pki
目录。[kubeconfig]
:生成相关的KubeConfig 文件,存放在/etc/kubernetes
目录。[control-plane]
:使用/etc/kubernetes/manifests
目录中的yaml文件创建kube-apiserver、kube-controller-manager、kube-scheduler的静态pod。[etcd]
:使用/etc/kubernetes/manifest
目录中的yaml文件安装Etcd服务。[wait-control-plane]
:等待control-plan部署的Master组件启动。[apiclient]
:检查Master组件的健康状态。[uploadconfig]
:更新配置。[kubelet]
:使用configMap配置kubelet。[mark-control-plane]
:为当前节点打标签,打了角色Master和不可调度标签,这样默认就不会使用Master节点来运行Pod。[bootstraptoken]
:生成token记录下来,后面使用kubeadm join
往集群中添加节点时会用到。[addons]
:安装附加组件CoreDNS和kube-proxy。
3.添加kubectl使用权限
普通用户要运行kubectl,需要执行以下命令,这也是kubeadm init
输出的一部分:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
root
用户,执行以下命令:
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
source .bash_profile
查看所有节点:
此时只有k8s-master
节点并且状态为NotReady,是因为还未安装网络插件,下面进行网络插件的安装,选择安装flannel插件。
4.安装flannel网络
由于raw.githubusercontent.com
无法访问,需先执行以下命令修改hosts
文件:
cat >> /etc/hosts << EOF
151.101.76.133 raw.githubusercontent.com
EOF
在k8s-master
上新建flannel网络,可以直接执行以下命令新建:
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
也可以先将flannel配置文件下载下来再新建,这里使用这种方式:
wget -P /usr/local/k8s https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
kubectl apply -f /usr/local/k8s/kube-flannel.yml
再次查看节点已经Ready:
5.备份镜像
如果使用了科学上网或指定的阿里云仓库部署的v1.18.3及以下版本的k8s,备份镜像是可选的。由于是使用的v1.18.5的k8s,work节点需要用到其中的部分镜像,由于网络原因无法拉取,需要导出镜像并传到work节点加载。
将镜像导出备份:
docker save -o /usr/local/k8s/k8s-images-v1.18.5.tar \
k8s.gcr.io/kube-proxy:v1.18.5 \
k8s.gcr.io/kube-apiserver:v1.18.5 \
k8s.gcr.io/kube-controller-manager:v1.18.5 \
k8s.gcr.io/kube-scheduler:v1.18.5 \
k8s.gcr.io/pause:3.2 \
k8s.gcr.io/coredns:1.6.7 \
k8s.gcr.io/etcd:3.4.3-0 \
quay.io/coreos/flannel:v0.12.0-amd64
导出成功:
在work节点创建目录用于存放镜像备份:
mkdir -p /usr/local/k8s
在k8s-master
执行以下命令将镜像备份拷贝到work节点:
scp -r /usr/local/k8s/k8s-images-v1.18.5.tar root@k8s-node1:/usr/local/k8s/
scp -r /usr/local/k8s/k8s-images-v1.18.5.tar root@k8s-node2:/usr/local/k8s/
然后在work节点加载镜像:
docker load -i /usr/local/k8s/k8s-images-v1.18.5.tar
加载成功:
七、工作节点加入集群
除特殊说明的地方外,在work节点执行本部分操作。在work节点执行以下命令将其加入到k8s集群,该命令也是kubeadm init
输出的一部分:
kubeadm join 192.168.1.16:6443 --token f5d1i5.por52kags01avsz7 \
--discovery-token-ca-cert-hash sha256:15171b3d8414d244ef63759fbf2c3006ade34ff081f4a0381329ddc64f249b75
如果没有保存这个命令可以使用以下命令创建新的token并生成一个新的加入集群命令:
kubeadm token create --print-join-command
1.k8s-node1加入集群
k8s-node1
加入集群成功:
2.k8s-node2加入集群
k8s-node2
加入集群成功:
3.查看集群状态
在master节点上查看集群状态。首先查看k8s组件健康状态,如下图所示,每个组件都处于healthy状态:
然后查看所有节点状态,如下图所示,所有节点都已经为Ready状态:
然后查看所有Pod状态,如下图所示,所有Pod都处于正常运行状态:
集群已处于正常状态。
八、kube-proxy开启ipvs
在k8s-master
节点执行本部分操作。首先查看日志,可知默认使用的iptables:
1.修改配置文件
执行以下命令修改ConfigMap的kube-system/kube-proxy中的config.conf
:
kubectl edit cm kube-proxy -n kube-system
设置mode
的值为"ipvs"
:
...
ipvs:
excludeCIDRs: null
minSyncPeriod: 0s
scheduler: ""
strictARP: false
syncPeriod: 0s
tcpFinTimeout: 0s
tcpTimeout: 0s
udpTimeout: 0s
kind: KubeProxyConfiguration
metricsBindAddress: ""
mode: "ipvs"
nodePortAddresses: null
oomScoreAdj: null
portRange: ""
showHiddenMetricsForVersion: ""
udpIdleTimeout: 0s
...
2.删除kube-proxy的pod
执行以下命令删除kube-proxy的Pod,k8s集群会创建新的kube-proxy的Pod,会直接使用ipvs模式:
kubectl get pod -n kube-system | grep kube-proxy | awk '{system("kubectl delete pod "$1" -n kube-system")}'
3.查看是否成功开启
查看kube-proxy的Pod:
kubectl get pods -n kube-system | grep proxy
查看kube-proxy-7grq4的日志:
kubectl logs kube-proxy-7grq4 -n kube-system
日志中打印出了Using ipvs Proxier,说明ipvs模式已经开启:
查看当前配置的虚拟服务列表:
ipvsadm -Ln
九、部署Dashboard
在k8s-master
节点执行本部分操作。
1.下载配置文件
首先下载配置文件:
wget -P /usr/local/k8s https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta8/aio/deploy/recommended.yaml
2.修改配置
vi编辑配置文件:
vi /usr/local/k8s/recommended.yaml
新增NodePort,端口设置为30001
,外网通过该端口访问:
---
kind: Service
apiVersion: v1
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kubernetes-dashboard
spec:
type: NodePort
ports:
- port: 443
targetPort: 8443
nodePort: 30001
selector:
k8s-app: kubernetes-dashboard
---
然后新建ServiceAccount并绑定集群管理员角色:
cat >> /usr/local/k8s/recommended.yaml << EOF
---
# ------------------- dashboard-admin ------------------- #
apiVersion: v1
kind: ServiceAccount
metadata:
name: dashboard-admin
namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
name: dashboard-admin
subjects:
- kind: ServiceAccount
name: dashboard-admin
namespace: kubernetes-dashboard
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
EOF
3.部署访问
执行以下命令进行部署:
kubectl apply -f /usr/local/k8s/recommended.yaml
查看kubernetes-dashboard状态:
kubectl get all -n kubernetes-dashboard
查看dashboard的Pod发现被分到了k8s-node1
节点:
kubectl get pod -n kubernetes-dashboard -o wide
查看Token:
kubectl describe secrets -n kubernetes-dashboard dashboard-admin
Token:
eyJhbGciOiJSUzI1NiIsImtpZCI6ImZFMV9sR2U4d2pVeUJJdTI5VkxXZVItcmozcnMxLXE5U1JSM0VrOE9IXzAifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkYXNoYm9hcmQtYWRtaW4tdG9rZW4tazV0bXoiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGFzaGJvYXJkLWFkbWluIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiYTk3ZGQwMTItMmU3MC00NzA5LWFlOGItMmNjMzg5NTg5YjU1Iiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmVybmV0ZXMtZGFzaGJvYXJkOmRhc2hib2FyZC1hZG1pbiJ9.QCbc3sL3YS2zFIhYs4rcf16iZJJ4hc4Niat0roaqA8O1cXcFrT5r2rjmKB5ix6Ks8eA7oMDg9vrb9iHIK-pi9NkskVOMmEO1l2OGvNidT-RQAr8EiBWb-QrcqM5AihWWKrCE68WAUrpCGo3cfHXjvHHhtpUEmm0rSuWdGTtIuYWFsAuBKND6_5RoZGNXIPBjeXU4J289u91fUPV45SQnPM206tRXONsJ3WiHgPE3UqxItUJQ9CPpIQJcqsCasu3NynXdd4wr7PwP6RmJSalusXIR6PwPaillHJUKbwNUM0KPmmQnfus_3A1DD6PoX-nA_g6OPcszDrg0IdFPZh0h7w
使用火狐浏览器访问https:节点ip:30001
即可访问dashboard页面。这里访问https:192.168.1.17:30001
:
复制粘贴token登录:
部署成功:
十、测试Kubernetes集群
在master节点进行操作。首先创建一个名为nginx-deployment
的Deployment。然后查看Deployment和Pod:
kubectl create deployment nginx-deployment --image=nginx:alpine
kubectl get deployment
kubectl get pod -o wide
可知名为nginx-deployment-5467bbdbc4-mlgwd
的Pod被分配到k8s-node1
节点并且虚拟ip为10.244.2.25
:
查看名为nginx-deployment-5467bbdbc4-mlgwd
的Pod的详细信息:
kubectl describe pod nginx-deployment-5467bbdbc4-mlgwd
获取名为nginx-deployment-5467bbdbc4-mlgwd
的Pod的日志:
kubectl logs nginx-deployment-5467bbdbc4-mlgwd
集群内部访问该Pod,成功返回nginx欢迎页面:
删除名为nginx-deployment-5467bbdbc4-mlgwd
的Pod:
kubectl delete pod nginx-deployment-5467bbdbc4-mlgwd
会自动创建一个Pod,因为Deployment会管理Pod,使Pod维持期望的副本数,这里未指定副本数默认就是一个。该Pod名为nginx-deployment-5467bbdbc4-pd248
,分配到k8s-node1
节点,ip为10.244.2.26
,集群内部依然能访问:
扩容Deployment维持期望的Pod副本数至3个:
kubectl scale --replicas=3 deployment nginx-deployment
有两个Pod被分配到了k8s-node1
节点,有一个Pod被分配到k8s-node2
节点,删除一个Pod后会自动创建一个新的Pod以维持期望的副本数:
访问nginx-deployment
下的这三个Pod需通过Service暴露一个端口。执行以下命令通过Service暴露8000
端口然后查看所有Service:
kubectl expose deployment nginx-deployment --port=8000 --target-port=80
kubectl get svc
nginx-deployment
的Service的CLUSTER-IP为10.103.150.184
,集群内部通过10.103.150.184:8000
成功访问:
查看当前虚拟服务列表可知Service其实是调度lvs模块实现的负载均衡:
如果外部想要访问nginx-deployment
下的这三个Pod,执行以下命令修改nginx-deployment
的Service配置:
kubectl edit svc nginx-deployment
将下面的type
的值改为NodePort
:
spec:
clusterIP: 10.103.150.184
ports:
- port: 8000
protocol: TCP
targetPort: 80
selector:
app: nginx-deployment
sessionAffinity: None
type: NodePort
再次查看所有Service:
此时集群中所有的节点都对外暴露了一个30589
端口,访问k8s节点ip:30589
,返回nginx欢迎页面,访问成功:
下面访问dashboard,可以查看Deployment、ReplicaSet、Pod、Service等资源的信息: