进入云原生时代,Kubernetes作为云原生的技术基石,一直是IT技术人学习与研究的方向。无论是开发者还是运维人员,在技术不断发展的今天,只有不断学习和提高自己,才能走得更高更远。作为国内领先的云计算服务商之一,腾讯云提供了云服务器产品,可以满足不同规模企业的需求,提供高性能、高可靠、高安全的云计算服务。我们个人可以借助腾讯云的平台与服务,提升自己的技术水平。本次实践基于腾讯云的CVM云服务器,在centos7操作系统下,使用Minikube来部署一个Kubernetes集群,并安装KubePi作为多集群可视化工具来管理Kubernetes集群。同时,在Kubernetes环境下部署Nginx应用来进行测试。通过以上实践,我们可以更好地了解和熟悉Kubernetes的部署和管理,并且掌握使用KubePi进行集群可视化管理的技巧。这将有助于我们在云原生时代更好地应对技术挑战,并提升自己在云计算领域的竞争力。
腾讯云服务器(Cloud Virtual Machine,CVM)是一种安全可靠的弹性计算服务。您可以根据业务需求实时调整计算资源的规模,实现资源的快速扩展和缩减,并按实际使用的资源进行计费。使用CVM可以有效降低软硬件采购成本,简化IT运维工作。
minikube简介:
Minikube是一个用于快速在macOS、Linux和Windows上设置本地Kubernetes集群的工具。它通过在本机启动一个虚拟环境,并在该环境中安装各种Kubernetes组件来实现这一功能。Minikube可以帮助开发人员在本地环境中轻松地测试、开发和部署应用程序,而无需依赖于真实的生产环境。通过使用Minikube,开发人员可以更加方便地进行Kubernetes相关的开发和调试工作。
minikube特点:
Kubernetes(也称为K8s)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。它提供了一个可靠的方式来处理容器化应用程序的部署和管理,使开发人员能够专注于应用程序的开发,而不必担心底层基础设施的管理。Kubernetes可以在多个主机上运行容器化应用程序,并提供容器的自动化编排和管理。它可以自动处理容器的调度、负载均衡、存储和网络等方面的任务,以确保应用程序在集群中可靠且高效地运行。Kubernetes还提供了一套API和命令行工具,使用户能够管理和监控集群、部署和更新应用程序、进行故障排除和调试等操作。它支持多种容器运行时,包括Docker和Containerd等。
KubePi 是一个现代化的 K8s 面板:KubePi 允许管理员导入多个 Kubernetes 集群,并且通过权限控制,将不同 cluster、namespace 的权限分配给指定用户。它允许开发人员管理 Kubernetes 集群中运行的应用程序并对其进行故障排查,供开发人员更好地处理 Kubernetes 集群中的复杂性。
1.本次实践基于腾讯云CVM云服务器环境; 2.本次实践使用的操作系统为centos7 ; 3.在一台CVM上使用Minikube来部署一个单节点Kubernetes集群; 4.部署一个Nginx测试应用; 5.在CVM云服务器上部署KubePi工具来管理k8s集群。
Minikube部署轻量级k8s集群环境要求::
本次实践环境具体规划如下:
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官网地址:/product/cvm
自定义配置——基础配置:
网络与主机配置:
下一步,确认配置信息。
检查配置信息,勾选同意协议,确认开通即可。
购买CVM云服务器后,会自动跳转到云服务器的实例列表,我们可以看到云服务器状态正在运行中。
复制云服务器的公网IP地址,远程连接时使用。
本地使用Xshell远程连接腾讯CVM云服务器
执行以下命令,修改云服务器主机名,重新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
执行以下命令,检查当前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。
curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh --mirror Aliyun
执行以下命令,配置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
创建部署目录/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?
下载minikube软件包
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
执行以下命令,开始安装minikube工具。
sudo install minikube-linux-amd64 /usr/local/bin/minikube
检查minikube版本,当前版本为v1.30.1版本。
[root@k8s minikube]# minikube version
minikube version: v1.32.0
commit: 8220a6eb95f0a4d75f7f2d7b14cef975f050512d
安装conntrack-tools工具.,此工具必须提前安装,否则在启动k8s集群时会直接报错。
yum -y install conntrack-tools
下载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
下载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
安装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/
执行以下命令,快速部署一个单机的轻量级k8s集群。
minikube start --driver=none --kubernetes-version=v1.26.3
国内环境下,使用国内镜像源拉取,速度会有点慢。
minikube start --image-mirror-country=cn --driver=none --kubernetes-version=v1.26.3
检查minikube状态,确保k8s各组件正常运行。
[root@k8s minikube]# minikube status
minikube
type: Control Plane
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured
执行以下命令,用于在minikube集群中添加一个新的节点。这个命令可以用于扩展集群,增加节点的数量,从而提高集群的可靠性和容量。
minikube node add
可以通过以下命令,删除所有本地k8s集群和配置文件,以防配置错误,清空环境,重新部署k8s集群。
minikube stop/delete # 停止、删除本地集群
minikube delete --all #删除所有本地集群和配置文件
执行以下命令,可以查看本地启动的相关k8s组件容器。
docker container ls
执行以下命令,可以看到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
检查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
编辑一个测试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
部署Nginx测试应用
[root@k8s minikube]# kubectl apply -f web.yaml
deployment.apps/my-testweb created
service/svs-web created
查看Nginx服务的pod及service状态
[root@k8s minikube]# kubectl get pods
NAME READY STATUS RESTARTS AGE
my-testweb-774f96d4d9-w8x66 1/1 Running 0 61s
[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
在腾讯云安全组在入方向上放行30060端口
在本地浏览器访问:http://云服务器公网IP地址:30060
执行以下命令,使用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容器
[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
[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
本地浏览器访问:http://公网IP地址:8098,将IP替换为自己云服务器的IP地址。需要在云服务器的安全组上放行8098端口,登录密码默认为admin/kubepi。
下载本地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面板。
添加成功后,可以看到k8s集群状态正常。
查看添加的k8s集群详细信息
腾讯云服务器CVM的强大性能大大提高了学习与实践的效率,在本次实践中,遇到了一些问题,但都得到了逐一解决。其中最重要的问题是minikube启动集群时拉取镜像速度过慢的问题。尽管使用了国内的镜像源,但仍然非常缓慢。除了使用国外云主机部署的方式,后来发现了更快的启动方法,即提前拉取启动k8s集群所需的镜像,或者导入别人准备好的镜像包到本地进行启动,这种方式省去了镜像拉取缓慢的问题。之后,可以在本次实践的基础上,添加更多的k8s工作节点,以提高集群的可靠性和容量,并发现更多k8s的可玩性。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。