kubeadm部署v1.18.5版Kubernetes集群

本文主要对使用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-2380etcd server client APIkube-apiserver,etcd
TCP入站10250Kubelet APIkubelet自身、控制平面组件
TCP入站10251kube-schedulerkube-scheduler自身
TCP入站10252kube-controller-managerkube-controller-manager自身

工作节点:

协议方向端口范围作用使用者
TCP入站10250Kubelet APIkubelet自身、控制平面组件
TCP入站30000-32767NodePort服务所有组件

注意事项:

  • 使用*标记的任意端口号都可以被覆盖,所以需要保证所定制的端口是开放的。
  • 虽然控制平面节点已经包含了etcd的端口,但也可以使用自定义的外部etcd集群或是指定自定义端口。
  • pod网络插件也可能需要开启某些特定端口。由于每个pod网络插件需开启的端口都有所不同,可以参阅他们的官方文档中对端口的要求。

二、环境信息

准备三台网络互通并能上外网的主机,这里使用的是三台虚拟机。本文所使用的环境如下:

主机名ip操作系统Dockerkuberneteskubeadmkubectlkubeletflannel配置备注
k8s-master192.168.1.16CentOS Linux release 8.2.200419.03.12v1.18.51.18.51.18.51.18.5v0.12.0-amd644C4Gk8s控制平面节点(control plane)
k8s-node1192.168.1.17CentOS Linux release 8.2.200419.03.12v1.18.51.18.51.18.51.18.5/4C4Gk8s工作节点(worker node)
k8s-node2192.168.1.18CentOS Linux release 8.2.200419.03.12v1.18.51.18.51.18.51.18.5/4C2Gk8s工作节点(worker node)

三、系统准备

除特殊说明的地方外,在control plane和work节点都执行本部分操作。

1.验证mac地址和uuid

cat /sys/class/net/ens160/address
cat /sys/class/dmi/id/product_uuid

k8s-master主机:
1
k8s-node1主机:
2
k8s-node2主机:
3
各节点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

已禁用:
4

6.关闭selinux

临时关闭:

setenforce 0

永久关闭需将SELinux设置为disabled:

sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config

重启系统,查看SELinux配置,成功关闭:
5

7.设置系统时区和同步时间

设置系统时区为亚洲/上海,如果安装时设置过,则跳过:

timedatectl set-timezone Asia/Shanghai

如未安装chrony,执行以下命令安装

yum install -y chrony

时间同步:

systemctl enable --now chronyd

查看同步状态:

timedatectl status

System clock synchronized: yes表示时钟已同步,NTP service: active表示开启了时钟同步服务:
6
将当前的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

7
该方式重启后会失效。想要永久新增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

8
重启后不会失效,永久新增了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

新增内核参数刷新生效:
9
验证是否生效:

sysctl -n net.bridge.bridge-nf-call-ip6tables
sysctl -n net.bridge.bridge-nf-call-iptables
sysctl -n net.ipv4.ip_forward

重启系统后验证是否生效,返回1表示生效:
10

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

11
查看是否已经正确加载所需的内核模块:

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

13
将公钥同步至k8s-node1k8s-node2

ssh-copy-id -i ~/.ssh/id_rsa.pub root@k8s-node1
ssh-copy-id -i ~/.ssh/id_rsa.pub root@k8s-node2

14
免密登录:

ssh root@k8s-node1
ssh root@k8s-node2

15

四、安装配置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

安装成功:
16
启动成功:
17

五、安装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

18
设置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

19
创建一个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

查看镜像:
20

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的版本号。

初始化过程的输出如下:
21
22
输出内容主要有以下关键信息:

  • [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

23
root用户,执行以下命令:

echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
source .bash_profile

24
查看所有节点:
25
此时只有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

26
再次查看节点已经Ready:
27

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

导出成功:
28
在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/

29
然后在work节点加载镜像:

docker load -i /usr/local/k8s/k8s-images-v1.18.5.tar

加载成功:
30

七、工作节点加入集群

除特殊说明的地方外,在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加入集群成功:
31

2.k8s-node2加入集群

k8s-node2加入集群成功:
32

3.查看集群状态

在master节点上查看集群状态。首先查看k8s组件健康状态,如下图所示,每个组件都处于healthy状态:
33
然后查看所有节点状态,如下图所示,所有节点都已经为Ready状态:
34
然后查看所有Pod状态,如下图所示,所有Pod都处于正常运行状态:
35
集群已处于正常状态。

八、kube-proxy开启ipvs

k8s-master节点执行本部分操作。首先查看日志,可知默认使用的iptables:
36

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")}'

37

3.查看是否成功开启

查看kube-proxy的Pod:

kubectl get pods -n kube-system | grep proxy

38
查看kube-proxy-7grq4的日志:

kubectl logs kube-proxy-7grq4 -n kube-system

日志中打印出了Using ipvs Proxier,说明ipvs模式已经开启:
39
查看当前配置的虚拟服务列表:

ipvsadm -Ln

40

九、部署Dashboard

k8s-master节点执行本部分操作。

1.下载配置文件

首先下载配置文件:

wget -P /usr/local/k8s https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta8/aio/deploy/recommended.yaml

41

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

42
查看kubernetes-dashboard状态:

kubectl get all -n kubernetes-dashboard

43
查看dashboard的Pod发现被分到了k8s-node1节点:

kubectl get pod -n kubernetes-dashboard -o wide

44
查看Token:

kubectl describe secrets -n kubernetes-dashboard dashboard-admin

45
Token:

eyJhbGciOiJSUzI1NiIsImtpZCI6ImZFMV9sR2U4d2pVeUJJdTI5VkxXZVItcmozcnMxLXE5U1JSM0VrOE9IXzAifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkYXNoYm9hcmQtYWRtaW4tdG9rZW4tazV0bXoiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGFzaGJvYXJkLWFkbWluIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiYTk3ZGQwMTItMmU3MC00NzA5LWFlOGItMmNjMzg5NTg5YjU1Iiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmVybmV0ZXMtZGFzaGJvYXJkOmRhc2hib2FyZC1hZG1pbiJ9.QCbc3sL3YS2zFIhYs4rcf16iZJJ4hc4Niat0roaqA8O1cXcFrT5r2rjmKB5ix6Ks8eA7oMDg9vrb9iHIK-pi9NkskVOMmEO1l2OGvNidT-RQAr8EiBWb-QrcqM5AihWWKrCE68WAUrpCGo3cfHXjvHHhtpUEmm0rSuWdGTtIuYWFsAuBKND6_5RoZGNXIPBjeXU4J289u91fUPV45SQnPM206tRXONsJ3WiHgPE3UqxItUJQ9CPpIQJcqsCasu3NynXdd4wr7PwP6RmJSalusXIR6PwPaillHJUKbwNUM0KPmmQnfus_3A1DD6PoX-nA_g6OPcszDrg0IdFPZh0h7w

使用火狐浏览器访问https:节点ip:30001即可访问dashboard页面。这里访问https:192.168.1.17:30001:
46
复制粘贴token登录:
47
部署成功:
48
49

十、测试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
50
查看名为nginx-deployment-5467bbdbc4-mlgwd的Pod的详细信息:

kubectl describe pod nginx-deployment-5467bbdbc4-mlgwd

51
获取名为nginx-deployment-5467bbdbc4-mlgwd的Pod的日志:

kubectl logs nginx-deployment-5467bbdbc4-mlgwd

52
集群内部访问该Pod,成功返回nginx欢迎页面:
53
删除名为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,集群内部依然能访问:
54
扩容Deployment维持期望的Pod副本数至3个:

kubectl scale --replicas=3 deployment nginx-deployment

有两个Pod被分配到了k8s-node1节点,有一个Pod被分配到k8s-node2节点,删除一个Pod后会自动创建一个新的Pod以维持期望的副本数:
55
访问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成功访问:
56
查看当前虚拟服务列表可知Service其实是调度lvs模块实现的负载均衡:
57
如果外部想要访问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:
58
此时集群中所有的节点都对外暴露了一个30589端口,访问k8s节点ip:30589,返回nginx欢迎页面,访问成功:
59
下面访问dashboard,可以查看Deployment、ReplicaSet、Pod、Service等资源的信息:
60

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

RtxTitanV

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值