一、前言

进入云原生时代,Kubernetes作为云原生的技术基石,一直是IT技术人学习与研究的方向。无论是开发者还是运维人员,在技术不断发展的今天,只有不断学习和提高自己,才能走得更高更远。作为国内领先的云计算服务商之一,腾讯云提供了云服务器产品,可以满足不同规模企业的需求,提供高性能、高可靠、高安全的云计算服务。我们个人可以借助腾讯云的平台与服务,提升自己的技术水平。本次实践基于腾讯云的CVM云服务器,在centos7操作系统下,使用Minikube来部署一个Kubernetes集群,并安装KubePi作为多集群可视化工具来管理Kubernetes集群。同时,在Kubernetes环境下部署Nginx应用来进行测试。通过以上实践,我们可以更好地了解和熟悉Kubernetes的部署和管理,并且掌握使用KubePi进行集群可视化管理的技巧。这将有助于我们在云原生时代更好地应对技术挑战,并提升自己在云计算领域的竞争力。

二、相关名词介绍

2.1 注册或登录腾讯云

​首先点击:注册或登录腾讯云

点击:注册并关联

注册成功之后打开,个人中心 点击实名认证

如已经有账号,则点击:我已经有腾讯云账号,登录后再关联

2.2 CVM云服务器介绍

腾讯云服务器(Cloud Virtual Machine,CVM)是一种安全可靠的弹性计算服务。您可以根据业务需求实时调整计算资源的规模,实现资源的快速扩展和缩减,并按实际使用的资源进行计费。使用CVM可以有效降低软硬件采购成本,简化IT运维工作。

2.3 minikube介绍

minikube简介:

Minikube是一个用于快速在macOS、Linux和Windows上设置本地Kubernetes集群的工具。它通过在本机启动一个虚拟环境,并在该环境中安装各种Kubernetes组件来实现这一功能。Minikube可以帮助开发人员在本地环境中轻松地测试、开发和部署应用程序,而无需依赖于真实的生产环境。通过使用Minikube,开发人员可以更加方便地进行Kubernetes相关的开发和调试工作。

minikube特点:

  • 支持最新的 Kubernetes 版本
  • 跨平台(Linux,macOS,Windows)
  • 部署为 VM、容器或裸机上
  • 多个容器运行时(CRI-O、containerd、docker)
  • 直接 API 端点,用于快速加载和构建映像
  • 高级功能,如负载平衡器、文件系统挂载、功能门和网络策略
  • 用于易于安装的 Kubernetes 应用程序的插件
  • 支持常见的 CI 环境

2.4 kubernetes介绍

Kubernetes(也称为K8s)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。它提供了一个可靠的方式来处理容器化应用程序的部署和管理,使开发人员能够专注于应用程序的开发,而不必担心底层基础设施的管理。Kubernetes可以在多个主机上运行容器化应用程序,并提供容器的自动化编排和管理。它可以自动处理容器的调度、负载均衡、存储和网络等方面的任务,以确保应用程序在集群中可靠且高效地运行。Kubernetes还提供了一套API和命令行工具,使用户能够管理和监控集群、部署和更新应用程序、进行故障排除和调试等操作。它支持多种容器运行时,包括Docker和Containerd等。

2.5 KubePi介绍

KubePi 是一个现代化的 K8s 面板:KubePi 允许管理员导入多个 Kubernetes 集群,并且通过权限控制,将不同 cluster、namespace 的权限分配给指定用户。它允许开发人员管理 Kubernetes 集群中运行的应用程序并对其进行故障排查,供开发人员更好地处理 Kubernetes 集群中的复杂性。

三、本次实践规划

3.1 本次实践介绍

1.本次实践基于腾讯云CVM云服务器环境; 2.本次实践使用的操作系统为centos7 ; 3.在一台CVM上使用Minikube来部署一个单节点Kubernetes集群; 4.部署一个Nginx测试应用; 5.在CVM云服务器上部署KubePi工具来管理k8s集群。

3.2 本次实践规划

Minikube部署轻量级k8s集群环境要求::

  • 2 个或更多 CPU
  • 2GB 可用内存
  • 20GB 可用磁盘空间
  • 互联网连接
  • 容器或虚拟机管理器,例如:Docker,QEMU,Hyperkit,Hyper-V,KVM,Parallels,Podman,VirtualBox或VMware Fusion/工作站

本次实践环境具体规划如下:

hostname

本地IP地址

Docker版本

操作系统版本

CPU核数

内存

硬盘

minikube版本

k8s版本

k8s

172.28.0.15

23.0.5

centos7

4

16G

50G

v1.30.1

v1.26.3

四、购买CVM云服务器

4.1 购买云服务器

腾讯云CVM官网地址:https://cloud.tencent.com/product/cvm

自定义配置——基础配置:

  • 计费模式:按需计费
  • 地域:选择国外地区,方便后面拉取镜像。
  • 可用区:随机可用区,自定义选择即可。
  • 实例配置:这里选择实例已选实例 S5.LARGE16(标准型S5,4核 16GB)

  • 实例规格:S5.LARGE16(标准型S5,4核 16GB)
  • 镜像:公共镜像,
  • 存储:默认选择50G SSD规格 点击“下一步”,设置网络和主机。

网络与主机配置:

  • 网络:选择默认的VPC或者新建VPC,根据自身需要选择。
  • 公网IP:勾选“分配独立公网IP”。
  • 线路类型:BGP
  • 带宽计费模式:按流量计费
  • 带宽值:100Mbps
  • 安全组:新建安全组,配置默认即可,后面服务需要放行安全组端口,则再行设置即可。

  • 实例名称:my-k8s,自定义设置即可。
  • 登录方式:设置密码登录,设置云服务器访问密码。
  • 其余配置默认

下一步,确认配置信息。

检查配置信息,勾选同意协议,确认开通即可。

4.2 检查CVM云服务器状态

购买CVM云服务器后,会自动跳转到云服务器的实例列表,我们可以看到云服务器状态正在运行中。

五、检查云服务器环境

5.1 本地远程登录云服务器

复制云服务器的公网IP地址,远程连接时使用。

5.2 远程ssh连接云服务器

本地使用Xshell远程连接腾讯CVM云服务器

5.3 查看操作系统版本

执行以下命令,修改云服务器主机名,重新SSH连接后,主机名生效。

hostnamectl set-hostname k8s

查看操作系统版本,当前操作系统版本为CentOS Linux release 7.6.1810。

[root@VM-0-15-centos ~]#  cat /etc/os-release
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"

CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"

查看内核版本,当前内核版本为3.10.0-1160.99.1.el7.x86_64。

[root@k8s ~]#  uname -r
3.10.0-1160.99.1.el7.x86_64

5.4 云服务器相关基础配置

执行以下命令,检查当前yum仓库状态。

[root@k8s ~]# yum repolist enabled
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
repo id                                            repo name                                                           status
epel/7/x86_64                                      EPEL for redhat/centos 7 - x86_64                                   13,786
extras/7/x86_64                                    Qcloud centos extras - x86_64                                          518
os/7/x86_64                                        Qcloud centos os - x86_64                                           10,072
updates/7/x86_64                                   Qcloud centos updates - x86_64                                       5,568
repolist: 29,944

执行以下命令,安装tree、git、wget、net-tools等基础软件,可根据自身需要安装其他软件。

yum   install tree wget net-tools git -y

六、安装Docker环境

6.1 安装Docker

执行以下部署脚本,一键安装Docker。

curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh --mirror Aliyun

6.2 Docker相关配置

执行以下命令,配置Docker的镜像加速。

echo '{ "registry-mirrors": ["https://docker.mirrors.sjtug.sjtu.edu.cn"] }'   > /etc/docker/daemon.json 
systemctl daemon-reload  && systemctl restart docker

开启内核IP转发功能

echo "net.ipv4.ip_forward=1" >>  /etc/sysctl.conf

查看是否成功:sysctl net.ipv4.ip_forward,如果返回为“net.ipv4.ip_forward = 1”则表示成功 sysctl。

sysctl -p
sysctl net.ipv4.ip_forward

检查当前Docker状态,确保Docker服务正常运行。

[root@k8s ~]# systemctl status docker
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
   Active: active (running) since Wed 2024-01-24 21:21:42 CST; 49s ago
     Docs: https://docs.docker.com
 Main PID: 12324 (dockerd)
    Tasks: 10
   Memory: 31.2M
   CGroup: /system.slice/docker.service
           └─12324 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

七、安装minikube

7.1 安装kubectl工具

创建部署目录/data/minikube,本次实践下载的文件都存放在此目录下。

mkdir -p /data/minikube && cd /data/minikube

下载kubectl二进制包

curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl

复制kubectl的二进制文件

mv kubectl /usr/bin/kubectl &&  chmod +x /usr/bin/kubectl 

检查kubectl的版本,本次安装的kubectl版本为v1.29.1。

[root@k8s minikube]# kubectl version
Client Version: v1.29.1
Kustomize Version: v5.0.4-0.20230601165947-6ce0bf390ce3
The connection to the server localhost:8080 was refused - did you specify the right host or port?

7.2 下载minikube软件包

下载minikube软件包

curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64

7.3 安装minikube

执行以下命令,开始安装minikube工具。

sudo install minikube-linux-amd64 /usr/local/bin/minikube

7.4 查看minikube版本

检查minikube版本,当前版本为v1.30.1版本。

[root@k8s minikube]# minikube version
minikube version: v1.32.0
commit: 8220a6eb95f0a4d75f7f2d7b14cef975f050512d

八、部署k8s集群

8.1 安装conntrack-tools工具

安装conntrack-tools工具.,此工具必须提前安装,否则在启动k8s集群时会直接报错。

yum -y install conntrack-tools

8.2 安装cri-dockerd

下载cri-dockerd软件,下载地址:https://github.com/Mirantis/cri-dockerd

wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.1/cri-dockerd-0.3.1.amd64.tgz

[root@k8s minikube]# ls
cri-dockerd-0.3.1.amd64.tgz  minikube-linux-amd64

解压复制cri-dockerd二进制文件

[root@k8s minikube]# tar -xzf cri-dockerd-0.3.1.amd64.tgz
[root@k8s minikube]# cp cri-dockerd/cri-dockerd /usr/bin/

查看cri-dockerd版本,本次使用的cri-dockerd版本为0.3.1。

[root@k8s minikube]# cri-dockerd --version
cri-dockerd 0.3.1 (7e528b98)

根据以下配置,编辑cri-dockerd的socket文件。

vim /etc/systemd/system/cri-docker.socket

[Unit]
Description=CRI Docker Socket for the API
PartOf=cri-docker.service

[Socket]
ListenStream=%t/cri-dockerd.sock
SocketMode=0660
SocketUser=root
SocketGroup=docker

[Install]
WantedBy=sockets.target

根据以下配置,编辑cri-docker的服务启动文件。

vim /etc/systemd/system/cri-docker.service

[Unit]
Description=CRI Interface for Docker Application Container Engine
Documentation=https://docs.mirantis.com
After=network-online.target firewalld.service docker.service
Wants=network-online.target
Requires=cri-docker.socket

[Service]
Type=notify
ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd:// --network-plugin= --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.6 --network-plugin=cni --cni-conf-dir=/etc/cni/net.d --cni-bin-dir=/opt/cni/bin
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always

# Note that StartLimit* options were moved from "Service" to "Unit" in systemd 229.
# Both the old, and new location are accepted by systemd 229 and up, so using the old location
# to make them work for either version of systemd.
StartLimitBurst=3

# Note that StartLimitInterval was renamed to StartLimitIntervalSec in systemd 230.
# Both the old, and new name are accepted by systemd 230 and up, so using the old name to make
# this option work for either version of systemd.
StartLimitInterval=60s

# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity

# Comment TasksMax if your systemd version does not support it.
# Only systemd 226 and above support this option.
TasksMax=infinity
Delegate=yes
KillMode=process

[Install]
WantedBy=multi-user.target

启动cri-dockerd服务,并设置开机启动。

systemctl enable  cri-docker.service --now

查看cri-dockerd服务状态,确保cri-docker服务正常启动。

[root@k8s minikube]# systemctl status cri-docker.service
● cri-docker.service - CRI Interface for Docker Application Container Engine
   Loaded: loaded (/etc/systemd/system/cri-docker.service; enabled; vendor preset: disabled)
   Active: active (running) since Wed 2024-01-24 22:05:16 CST; 28s ago
     Docs: https://docs.mirantis.com
 Main PID: 23347 (cri-dockerd)
    Tasks: 9
   Memory: 14.1M
   CGroup: /system.slice/cri-docker.service

8.3 安装crictl

下载crictl软件,下载地址:https://github.com/kubernetes-sigs/cri-tools/releases/tag/v1.27.0

wget https://github.com/kubernetes-sigs/cri-tools/releases/download/v1.27.0/crictl-v1.27.0-linux-amd64.tar.gz

[root@k8s minikube]# ls
crictl-v1.27.0-linux-amd64.tar.gz  cri-dockerd  cri-dockerd-0.3.1.amd64.tgz  minikube-linux-amd64

解压crictl软件包

tar -xzf crictl-v1.27.0-linux-amd64.tar.gz  -C /usr/bin/

检查crictl版本,本次使用的crictl版本为v1.27.0。

[root@k8s minikube]#  crictl -version
crictl version v1.27.0

8.4 安装cni-plugins

安装cni-plugins,下载地址:https://github.com/containernetworking/plugins/releases

wget https://github.com/containernetworking/plugins/releases/download/v1.2.0/cni-plugins-linux-amd64-v1.2.0.tgz

[root@k8s minikube]# ls
cni-plugins-linux-amd64-v1.2.0.tgz  cri-dockerd                  minikube-linux-amd64
crictl-v1.27.0-linux-amd64.tar.gz   cri-dockerd-0.3.1.amd64.tgz

执行以下命令,创建/opt/cni/bin/目录。

mkdir -p /opt/cni/bin/

解压 cni-plugins到/opt/cni/bin/

tar -xzf  cni-plugins-linux-amd64-v1.2.0.tgz  -C /opt/cni/bin/

8.5 部署k8s集群

执行以下命令,快速部署一个单机的轻量级k8s集群。

minikube start  --driver=none --kubernetes-version=v1.26.3

国内环境下,使用国内镜像源拉取,速度会有点慢。

minikube start --image-mirror-country=cn --driver=none --kubernetes-version=v1.26.3

  • --driver=none Minikube使用无驱动程序的方式来创建Kubernetes本地环境
  • --registry-mirror=***为了拉取Docker Hub镜像,需要为 Docker daemon 配置镜像加速,参考阿里云镜像服务
  • --kubernetes-version=***: minikube 虚拟机将使用的 kubernetes 版本

8.6 检查minikube状态

检查minikube状态,确保k8s各组件正常运行。

[root@k8s minikube]# minikube status
minikube
type: Control Plane
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured

8.7 新增k8s集群节点

执行以下命令,用于在minikube集群中添加一个新的节点。这个命令可以用于扩展集群,增加节点的数量,从而提高集群的可靠性和容量。

minikube node add

8.8 清空k8s环境

可以通过以下命令,删除所有本地k8s集群和配置文件,以防配置错误,清空环境,重新部署k8s集群。

minikube stop/delete # 停止、删除本地集群
minikube delete --all #删除所有本地集群和配置文件

九、检查k8s环境

9.1 检查本地容器

执行以下命令,可以查看本地启动的相关k8s组件容器。

docker container ls

9.2 检查k8s集群节点状态

执行以下命令,可以看到k8s所有节点状态

[root@k8s minikube]# kubectl get nodes -owide
NAME   STATUS   ROLES           AGE     VERSION   INTERNAL-IP   EXTERNAL-IP   OS-IMAGE                KERNEL-VERSION       CONTAINER-RUNTIME
k8s    Ready    control-plane   5m52s   v1.26.3   172.28.0.15   <none>        CentOS Linux 7 (Core)   3.10.0-1160.99.1.el7.x86_64   docker://25.0.1

9.3 检查k8s集群系统pod状态

检查k8s集群系统pod状态

[root@k8s minikube]# kubectl get pods -n kube-system
NAME                          READY   STATUS    RESTARTS   AGE
coredns-567c556887-lv6fl      1/1     Running   0          7m50s
etcd-k8s                      1/1     Running   0          8m3s
kube-apiserver-k8s            1/1     Running   0          8m3s
kube-controller-manager-k8s   1/1     Running   0          8m4s
kube-proxy-5cxbh              1/1     Running   0          7m50s
kube-scheduler-k8s            1/1     Running   0          8m3s
storage-provisioner           1/1     Running   0          8m2s

十、部署Nginx测试应用

10.1 编辑部署文件

编辑一个测试web.yaml文件

vim web.yaml 

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-testweb
  labels:
    app: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app:  nginx
    spec:
      containers:
      - name: nginx
        image: nginx:alpine
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: nginx
  name: svs-web
spec:
#  clusterIP: None
  ports:
  - name: web-port
    port: 80
    protocol: TCP
    targetPort: 80
    nodePort: 30060
  selector:
    app: nginx
  type: NodePort

10.2 部署测试应用

部署Nginx测试应用

[root@k8s minikube]# kubectl apply -f web.yaml
deployment.apps/my-testweb created
service/svs-web created

10.3 检查Nginx的pod和service状态

查看Nginx服务的pod及service状态

  • 查看pod状态
[root@k8s minikube]# kubectl get pods
NAME                          READY   STATUS    RESTARTS   AGE
my-testweb-774f96d4d9-w8x66   1/1     Running   0          61s

  • 查看service资源对象
[root@k8s minikube]# kubectl get service
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP        14m
svs-web      NodePort    10.97.128.248   <none>        80:30060/TCP   90s

10.4 本地访问Nginx应用

在腾讯云安全组在入方向上放行30060端口

在本地浏览器访问:http://云服务器公网IP地址:30060

十一、部署KubePi管理面板

11.1 安装KubePi管理面板

执行以下命令,使用docker-cli快速创建KubePi容器。

docker run --privileged -d -v /root/.minikube:/root/.minikube --name kubepi --restart=unless-stopped -p 8098:80 kubeoperator/kubepi-server

使用以下docker-compose.yaml部署文件,创建KubePi容器。

version: '3'
services:
  kubepi:
    image: kubeoperator/kubepi-server
    privileged: true
    volumes:
      - /root/.minikube:/root/.minikube
    restart: unless-stopped
    ports:
      - 8098:80

docker compose up -d  #创建KubePi容器

11.2 检查kubepi容器日志

  • 检查kubepi容器状态,确保kubepi容器正常启动。
[root@k8s minikube]# docker compose ps
NAME                COMMAND                  SERVICE             STATUS              PORTS
minikube-kubepi-1   "tini -g -- kubepi-s…"   kubepi              running             0.0.0.0:8098->80/tcp, :::8098->80/tcp

  • 检查kubepi容器日志,确保KubePi服务正常运行。
[root@k8s minikube]# docker logs kubepi
\config file not found in , skip
time="2024-01-25T19:22:47+08:00" level=info msg="current db version: 0"
time="2024-01-25T19:22:47+08:00" level=info msg="executing db migration: [1]  Create default user and cluster"
time="2024-01-25T19:22:47+08:00" level=info msg="executing db migration: [2]  Add role repo manager"
time="2024-01-25T19:22:47+08:00" level=info msg="update db to version: 2"
Now listening on: http://0.0.0.0

11.3 访问kubepi面板

本地浏览器访问:http://公网IP地址:8098,将IP替换为自己云服务器的IP地址。需要在云服务器的安全组上放行8098端口,登录密码默认为admin/kubepi。

11.4 添加k8s集群

下载本地kubeconfig文件,在k8s集群中,kubeconfig文件一般默认在 $HOME/.kube目录下。

sudo mv /root/.kube /root/.minikube $HOME
sudo chown -R $USER $HOME/.kube $HOME/.minikube

[root@k8s minikube]# ls /root/.kube/
cache  config

上传kubeconfig文件到kubepi面板。

11.5 查看k8s集群状态

添加成功后,可以看到k8s集群状态正常。

查看添加的k8s集群详细信息

十二、总结

腾讯云服务器CVM的强大性能大大提高了学习与实践的效率,在本次实践中,遇到了一些问题,但都得到了逐一解决。其中最重要的问题是minikube启动集群时拉取镜像速度过慢的问题。尽管使用了国内的镜像源,但仍然非常缓慢。除了使用国外云主机部署的方式,后来发现了更快的启动方法,即提前拉取启动k8s集群所需的镜像,或者导入别人准备好的镜像包到本地进行启动,这种方式省去了镜像拉取缓慢的问题。之后,可以在本次实践的基础上,添加更多的k8s工作节点,以提高集群的可靠性和容量,并发现更多k8s的可玩性。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐