从零开始的Kubernetes
环境准备下载链接: 通过网盘分享的文件:icecream-ebook-reader-pro.exe等4个文件 链接:https://pan.baidu.com/s/1szqZW-h00dATNQ1GKoXhow 提取码: miao安装指南:https://blog.csdn.net/m0_66490812/article/details/137812550?提示:以下是本篇文章正文内容,下面案例可
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
环境准备
VM Ware 16.2.4 CentOS 7
下载链接: 通过网盘分享的文件:icecream-ebook-reader-pro.exe等4个文件 链接: https://pan.baidu.com/s/1szqZW-h00dATNQ1GKoXhow 提取码: miao
安装指南:https://blog.csdn.net/m0_66490812/article/details/137812550?提示:以下是本篇文章正文内容,下面案例可供参考
一、虚拟机配置
虚拟机使用NET网络转换初始时是没有IP的
在终端中输入:
ifconfig
查看网卡的名称,一般都是ens开头:
[root@k-master1 ~]# ifconfig
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
inet6 fe80::42:71ff:febc:dd7e prefixlen 64 scopeid 0x20<link>
ether 02:42:71:bc:dd:7e txqueuelen 0 (Ethernet)
RX packets 12685 bytes 268450228 (256.0 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 11538 bytes 43388952 (41.3 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.119.135 netmask 255.255.255.0 broadcast 192.168.119.255
inet6 fe80::534c:75df:83db:8fe3 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:fd:83:89 txqueuelen 1000 (Ethernet)
RX packets 412804 bytes 49912910 (47.6 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 736779 bytes 1141787837 (1.0 GiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
进入网卡配置的目录里面 :
cd /etc/sysconfig/network-scripts/
vim编辑刚刚查看的网卡名称:
vim ifcfg-ens33
onboot属性修改为yes
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=dhcp
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=3430f760-91ca-45f5-8b2a-b4f56d386b8c
DEVICE=ens33
ONBOOT=yes
重启网络服务,需要等一下,两种重启方式(选择其中一个就好)
service network restart
systemctl restart network
完成了网络配置的初始化,接下来在VMware中拍摄快照
然后关闭这台虚拟机,右键点击管理,选择克隆
然后克隆出两个一样的虚拟机,名字分别命名为:K-Master、K-Node1、K-Node2
Master节点配置建议为2核4G,Node节点建议配置为1核2G
这样我们的虚拟机就配置好了
二、安装步骤
先用config确认好自己三台虚拟机的IP
e.g. 192.168.119.135(master)
192.168.119.136
192.168.119.137
对三个操作系统进行初始化操作
#关闭防火墙
systemctl stop fierwalld #临时关闭
systemctl disable fierwalld #永久关闭
#关闭selinux
sed -i 's/enforcing/disabled/' /etc/selinux/config # 永久
setenforce 0 # 临时
#关闭swap分区
swapoff -a #临时
sed -ri 's/.swap./#&/' /etc/fstab #永久
根据规划设置主机名
hostnamectl set-hostname k8s-master
节点执行
hostnamectl set-hostname k8s-node1
hostnamectl set-hostname k8s-node2
在master添加hosts 只在master中执行
cat >> /etc/hosts << EOF
192.168.119.135 k8s-master
192.168.119.136 k8s-node1
192.168.119.137 k8s-node2
EOF
将桥接的 IPv4 流量传递到 iptables 的链
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system # 生效
时间同步
yum install ntpdate -y
ntpdate time.windows.com
替换阿里云YUM源
rm -rf /etc/yum.repos.d/*
curl https://mirrors.aliyun.com/repo/Centos-7.repo -o /etc/yum.repos.d/CentOS-Base.repo
安装docker
在所有节点上安装并启动Docker。
#下载阿里云Yum软件源文件:
curl -o /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#安装指定版本Docker:
yum install -y docker-ce
#配置镜像下载加速器:
cat > /etc/docker/daemon.json << EOF
{
"registry-mirrors": ["https://docker.ketches.cn","https://docker.1ms.run","https://hub1.nat.tf"],
"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
#启动并设置开机启动:
systemctl start docker && systemctl enable docker
从Kubernetes 1.24开始,使用Docker作为容器运行时,需要安装cri-dockerd。
CRI-Dockerd Release
找到适用于你系统平台版本的安装包,下载后上传到所有节点上并进行安装:
rpm -ivh cri-dockerd-0.3.2-3.el7.x86_64.rpm
安装完成后,修改Systemd服务文件指定依赖的Pause镜像为国内镜像地址:
vi /usr/lib/systemd/system/cri-docker.service
…
ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd:// --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.9
…
#启动并设置开机启动:
systemctl start cri-docker && systemctl enable cri-docker
安装kubeadm和kubelet
在所有节点上安装kubeadm、kubectl和kubelet组件。
#这些软件包未包含在系统默认软件源中,需要额外配置Yum软件源,例如配置阿里云的软件源:
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.33/rpm/
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.33/rpm/repodata/repomd.xml.key
EOF
#安装指定版本kubeadm、kubectl和kubelet:
yum install -y kubeadm kubectl kubelet
#设置开机启动:
systemctl enable kubelet
部署Master节点
在Master节点执行以下命令初始化Kubernetes管理节点:
kubeadm init \
--apiserver-advertise-address=192.168.119.135 \
--image-repository=registry.aliyuncs.com/google_containers \
--kubernetes-version=v1.28.2 \
--pod-network-cidr=10.244.0.0/16 \
--service-cidr=10.96.0.0/12 \
--cri-socket=unix:///var/run/cri-dockerd.sock \
--ignore-preflight-errors=all
初始化成功:
kubeadm join 192.168.119.135:6443 --token lu2d05.fp2vfdxre0cjwoeh \
--discovery-token-ca-cert-hash sha256:03237a5eda7decbe8b08014fa375175145eeed44aee4c0eaff39bb9f54ae1f37\
--cri-socket=unix:///var/run/cri-dockerd.sock \
--ignore-preflight-errors=all
根据上述提示,执行以下命令开始使用集群:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
部署Node节点
在两台工作节点执行上述返回的“kubeadm init”命令,并添加“–cri-socket”参数,以将这些工作节点加入到集群中:
kubeadm join 192.168.119.135:6443 --token lu2d05.fp2vfdxre0cjwoeh \
--discovery-token-ca-cert-hash sha256:03237a5eda7decbe8b08014fa375175145eeed44aee4c0eaff39bb9f54ae1f37\
--cri-socket=unix:///var/run/cri-dockerd.sock \
--ignore-preflight-errors=all
可以在
Master节点执行“kubectl get nodes”命令查看节点,结果如下:
[root@localhost ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k-master1 NotReady control-plane 10m v1.28.2
k-node1 NotReady 22s v1.28.2
k-node2 NotReady 13s v1.28.2
在上述结果中,节点状态显示为“NotReady”,表示节点尚未准备就绪。这是由于kubelet服务未发现网络插件导致的,kubelet日志中也有相关说明(“network plugin is not ready”)。
Kubernetes网络插件主要用于实现集群内部Pod通信,它负责配置和管理Pod的网络。常见的网络插件包括Calico、Flannel、Cilium等
这里选择Flannel作为网络插件
直接远程下载并安装
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/v0.22.0/Documentation/kube-flannel.yml
#会出现以下提示:
[root@localhost ~]# kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/v0.22.0/Documentation/kube-flannel.yml
namespace/kube-flannel created
clusterrole.rbac.authorization.k8s.io/flannel created
clusterrolebinding.rbac.authorization.k8s.io/flannel created
serviceaccount/flannel created
configmap/kube-flannel-cfg created
daemonset.apps/kube-flannel-ds created
此时再次执行kubectl get nodes
[root@localhost ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k-master1 Ready control-plane 15m v1.28.2
k-node1 Ready 4m59s v1.28.2
k-node2 Ready 4m50s v1.28.2
这样,就初始化成功了!
三、部署Dashboard
直接下载yaml文件部署
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml
#输出以下内容:
[root@localhost ~]# kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml
namespace/kubernetes-dashboard created
serviceaccount/kubernetes-dashboard created
service/kubernetes-dashboard created
secret/kubernetes-dashboard-certs created
secret/kubernetes-dashboard-csrf created
secret/kubernetes-dashboard-key-holder created
configmap/kubernetes-dashboard-settings created
role.rbac.authorization.k8s.io/kubernetes-dashboard created
clusterrole.rbac.authorization.k8s.io/kubernetes-dashboard created
rolebinding.rbac.authorization.k8s.io/kubernetes-dashboard created
clusterrolebinding.rbac.authorization.k8s.io/kubernetes-dashboard created
deployment.apps/kubernetes-dashboard created
service/dashboard-metrics-scraper created
deployment.apps/dashboard-metrics-scraper created
查看运行状态:
[root@localhost ~]# kubectl get pods -n kubernetes-dashboard
NAME READY STATUS RESTARTS AGE
dashboard-metrics-scraper-5657497c4c-njxgl 1/1 Running 0 45s
kubernetes-dashboard-78f87ddfc-b466s 1/1 Running 0 45s
创建管理员服务账号
kubectl create serviceaccount dashboard-admin -n kubernetes-dashboard
绑定集群管理员角色
kubectl create clusterrolebinding dashboard-admin-binding \
--clusterrole=cluster-admin \
--serviceaccount=kubernetes-dashboard:dashboard-admin
获取访问令牌(Token)
kubectl create token dashboard-admin -n kubernetes-dashboard
[root@localhost ~]# kubectl create token dashboard-admin -n kubernetes-dashboard
eyJhbGciOiJSUzI1NiIsImtpZCI6IjRwb1VZR1ctd2RGcktYYWlzSldMNDVZdWw0Um95RWNNcnpKTjgxSnlyWGMifQ.eyJhdWQiOlsiaHR0cHM6Ly9rdWJlcm5ldGVzLmRlZmF1bHQuc3ZjLmNsdXN0ZXIubG9jYWwiXSwiZXhwIjoxNzU4MDcyNzE5LCJpYXQiOjE3NTgwNjkxMTksImlzcyI6Imh0dHBzOi8va3ViZXJuZXRlcy5kZWZhdWx0LnN2Yy5jbHVzdGVyLmxvY2FsIiwia3ViZXJuZXRlcy5pbyI6eyJuYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsInNlcnZpY2VhY2NvdW50Ijp7Im5hbWUiOiJkYXNoYm9hcmQtYWRtaW4iLCJ1aWQiOiI4ZDRjMmFiZS0zYTVkLTQ3YzAtOTg0Yi00M2YxODk3YmVkYTEifX0sIm5iZiI6MTc1ODA2OTExOSwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmVybmV0ZXMtZGFzaGJvYXJkOmRhc2hib2FyZC1hZG1pbiJ9.t7kBuZePIiqWY0lBnZMgCEsJ3nVwHDxhOMn8Xm-jDf4gAbCKJXbb1lBhweKVPsxGPWbVM079MY-S9v6NoYTYIii939xv9-2iLjCvQAHbQy2ubbTzpw6bkCBsOf3uu-16C9JUKXf_YJsCSm7foSUpv_VVsukZA04-SYkyyGR_1zS0a-s1TESPwSS7O97zmHu_1XCYefl_IaATxB7Tjv1ui5o1QYK0L5brrE3hR1R5PJ3yp_Tg-0elckhFX7ErFexnZQsFfUzlBoAJ0M80I4zvG10o0-uYmVFD0pUCYUzYrhKKC6D0yifyi01oEcwGqEtWL3lOUyH9CVLGnsZnM6JMeg
访问 Dashboard
方法 1:使用 kubectl 端口转发(推荐)
kubectl port-forward -n kubernetes-dashboard service/kubernetes-dashboard 8443:443
然后在本地浏览器访问:https://localhost:8443
方法 2:通过 NodePort 访问(适用于远程访问)
如果需要从外部访问,可以修改 Service 类型为 NodePort:
kubectl patch service kubernetes-dashboard -n kubernetes-dashboard -p '{"spec":{"type":"NodePort"}}'
# 查看分配的端口
kubectl get service kubernetes-dashboard -n kubernetes-dashboard
然后通过https://<节点IP>:访问。
登录 Dashboard
在登录页面选择 “Token” 选项,粘贴之前获取的令牌,点击 “登录” 即可进入 Dashboard 界面。
Dashboard 提供了直观的 Web 界面,可以查看集群状态、部署应用、管理资源等操作。
如果遇到访问问题,可以检查网络策略和防火墙设置,确保访问端口(如 8443)已开放。
四、部署简单测试应用WordPress
前提条件
已运行的 Kubernetes 集群(控制平面和节点正常工作)
kubectl命令行工具已配置并能连接集群
集群已安装网络插件(如 Flannel、Calico 等)
1:创建持久化存储(PVC)
WordPress 和数据库需要持久化存储来保存数据(文章、配置、数据库文件等),避免 Pod 重启后数据丢失。
创建wm-pvc.yaml文件
# WordPress数据存储
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: wordpress-pvc
spec:
accessModes:
- ReadWriteOnce # 单节点读写
resources:
requests:
storage: 10Gi # 申请10GB存储空间
---
# MySQL数据库存储
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi # 数据库5GB存储空间
PVC 需要绑定PV或配置自动创建 PV 的 StorageClass。
手动创建一个 PV 并与 PVC 绑定:
创建 wm-pv.yaml 文件
apiVersion: v1
kind: PersistentVolume
metadata:
name: wordpress-manual-pv # 用于WordPress的PV
spec:
capacity:
storage: 10Gi # 容量需 >= PVC请求的10Gi
accessModes:
- ReadWriteOnce # 访问模式需与PVC一致
hostPath:
path: /data/wordpress-pv # 节点上的实际存储路径(需提前创建)
type: DirectoryOrCreate # 若路径不存在则自动创建
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: mysql-manual-pv # 用于MySQL的PV
spec:
capacity:
storage: 5Gi # 容量需 >= PVC请求的5Gi
accessModes:
- ReadWriteOnce
hostPath:
path: /data/mysql-pv
type: DirectoryOrCreate
应用PV配置并创建PVC
kubectl apply -f wm-pv.yaml
kubectl apply -f wm-pvc.yaml
#查看PVC状态
kubectl get pvc
[root@localhost ~]# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
mysql-pvc Bound mysql-manual-pv 5Gi RWO 36s
wordpress-pvc Bound wordpress-manual-pv 10Gi RWO 36s
2:部署 MySQL 数据库(WordPress 依赖)
WordPress 需要数据库存储内容,这里使用 MySQL 作为数据库。
创建mysql-deployment.yaml文件(包含数据库部署、服务和密码管理)
# 存储数据库密码(避免明文)
apiVersion: v1
kind: Secret
metadata:
name: mysql-secrets
type: Opaque
data:
# 密码需用base64编码(生成方式:echo -n "你的密码" | base64)
root-password: cm9vdHBhc3N3b3Jk # 示例:rootpassword
wp-password: d29yZHByZXNzMTIz # 示例:wordpress123
---
# MySQL部署
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql
spec:
replicas: 1
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:8.0 # 官方MySQL镜像
ports:
- containerPort: 3306
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secrets
key: root-password
- name: MYSQL_DATABASE
value: wordpress # 预先创建WordPress数据库
- name: MYSQL_USER
value: wpuser # WordPress专用数据库用户
- name: MYSQL_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secrets
key: wp-password
volumeMounts:
- name: mysql-data
mountPath: /var/lib/mysql # 挂载存储卷
volumes:
- name: mysql-data
persistentVolumeClaim:
claimName: mysql-pvc # 关联步骤1创建的PVC
---
# MySQL服务(集群内访问)
apiVersion: v1
kind: Service
metadata:
name: mysql-service
spec:
selector:
app: mysql
ports:
- port: 3306
targetPort: 3306
clusterIP: None # 无头服务,通过服务名访问
应用配置:
kubectl apply -f mysql-deployment.yaml
#检查 MySQL 部署状态(确保 Pod 为Running)
kubectl get pods -l app=mysql
3:部署 WordPress 应用
创建wordpress-deployment.yaml文件,配置 WordPress 部署和服务
apiVersion: apps/v1
kind: Deployment
metadata:
name: wordpress
spec:
replicas: 1 # 可根据需求调整副本数
selector:
matchLabels:
app: wordpress
template:
metadata:
labels:
app: wordpress
spec:
containers:
- name: wordpress
image: wordpress:latest # 官方WordPress镜像(内置PHP和Apache)
ports:
- containerPort: 80 # 暴露80端口(Apache)
env:
- name: WORDPRESS_DB_HOST
value: mysql-service # 连接步骤2的MySQL服务
- name: WORDPRESS_DB_USER
value: wpuser # 对应MySQL的用户
- name: WORDPRESS_DB_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secrets
key: wp-password # 从Secret读取密码
- name: WORDPRESS_DB_NAME
value: wordpress # 对应MySQL的数据库名
volumeMounts:
- name: wordpress-data
mountPath: /var/www/html # 挂载存储卷(保存WordPress数据)
volumes:
- name: wordpress-data
persistentVolumeClaim:
claimName: wordpress-pvc # 关联步骤1创建的PVC
---
# WordPress服务(外部访问)
apiVersion: v1
kind: Service
metadata:
name: wordpress-service
spec:
selector:
app: wordpress
ports:
- port: 80
targetPort: 80
type: NodePort # 暴露到节点端口(适合测试)
# 生产环境建议用LoadBalancer或Ingress
应用配置:
kubectl apply -f wordpress-deployment.yaml
#检查 WordPress 部署状态:
kubectl get pods -l app=wordpress
4:访问 WordPress
查看 WordPress 服务的节点端口(NodePort):
kubectl get svc wordpress-service
[root@localhost ~]# kubectl get pods -l app=wordpress
NAME READY STATUS RESTARTS AGE
wordpress-5556b5cd67-57z2w 1/1 Running 0 72s
通过节点 IP 和端口访问:
在浏览器中输入 http://<集群节点IP>:(例如 http://192.168.56.10:31234)。
首次访问将进入 WordPress 安装界面,设置管理员账号和网站信息即可。
总结
一步步部署自己的Kubernetes集群,并且部署了两个简单的Web应用。
缺少错误处理,将会在下一篇内容详细讲解。
更多推荐
所有评论(0)