从k8s集群搭建到拉取私有库镜像对外服务
网上有很多教程是写如何如何搭建一个k8s集群的,其实有的文章我看了就头晕,所以干脆自己来写一篇
简单聊一下k8s
我们平时用docker部署几个容器,可以花很少的时间去管理和维护,但是假如在生产环境中有几百个容器,这该如何管理,并且还能保证我们的服务实现高可靠,高并发,于是k8s就出现了。
他能为我们提供一个可弹性运行分布式系统的框架,主要可以为我们实现以下功能
- 服务发现、负载均衡
- 自动部署和回滚
- 自动完成装箱计算(比如弹性伸缩)
- 自我修复
好了直接切入主题,在我们开始搭建之前,已经假设你对k8s的基础架构已经有一定的认识
我用的vm虚拟机建立了2台linux服务器,每台2G内存和2CPU(最好是三台及三台以上的奇数个服务器),其中一台为master,其余一台是node节点,linux内核版本为7.9,k8s client和server的版本都是1.5.2(yum包的最新版本)
角色 主机名 IP地址
Master master 192.168.175.3
Node node1 192.168.175.250
接下来我们会分为以下四个步骤
- 准备系统环境(所有节点)
- 配置master
- 配置minion节点(node)*到这里集群已经搭建完毕
- 拉取镜像启动服务
第一步:将系统环境准备好,以便这些因素不会影响我们的搭建,如下所示,你只需要复制粘贴就可以了,每台机器都要这样做
# 关闭防火墙
systemctl disable firewalld
systemctl stop firewalld
# 关闭selinux
# 临时禁用selinux
setenforce 0
# 永久关闭 修改/etc/sysconfig/selinux文件设置
sed -i 's/SELINUX=permissive/SELINUX=disabled/' /etc/sysconfig/selinux
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
# 禁用交换分区
swapoff -a
# 永久禁用,打开/etc/fstab注释掉swap那一行。
sed -i 's/.*swap.*/#&/' /etc/fstab
# 修改内核参数
cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system
第二步:配置master
- 从yum包安这几个服务,k8s默认安装最新的,目前是1.5.2
命令:[root@master ~]# yum install -y kubernetes etcd flannel ntp
命令:[root@node1 ~]# yum install -y kubernetes etcd flannel ntp
- 配置etcd
命令:[root@master ~]# vim /etc/etcd/etcd.conf #修改以下配置
ETCD_LISTEN_CLIENT_URLS="http://localhost:2379,http://192.168.175.3:2379"
ETCD_NAME="etcd"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.175.3:2379"
- 启动服务
命令:[root@master ~]# systemctl start etcd
命令:[root@master ~]# systemctl status etcd
命令:[root@master ~]# systemctl enable etcd
- 查看状态
命令:[root@master ~]# ss -antulp | grep 2379
- 检查 etcd 集群成员列表
命令:[root@master ~]# etcdctl member list 只有一台
- 配置master配置文件
命令:[root@master ~]# vim /etc/kubernetes/config #修改以下配置文件
KUBE_MASTER="--master=http://192.168.175.3:8080"
- 配置apiserver配置文件
命令:[root@master ~]# vim /etc/kubernetes/apiserver
KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"
KUBE_ETCD_SERVERS="--etcd-servers=http://192.168.175.3:2379"
KUBE_ADMISSION_CONTROL="--admission-control=AlwaysAdmit"
- 配置 kube-scheduler 配置文件
命令:[root@master ~]# vim /etc/kubernetes/scheduler
KUBE_SCHEDULER_ARGS="0.0.0.0"
- 配置 etcd,指定容器云中 docker 的 IP 网段
命令:[root@master ~]# etcdctl mkdir /k8s/network
命令:[root@master ~]# etcdctl set /k8s/network/config '{"Network": "10.255.0.0/16"}'
命令:[root@master ~]# etcdctl get /k8s/network/config
- 设置flanneld服务
命令:[root@master ~]# vim /etc/sysconfig/flanneld
FLANNEL_ETCD_ENDPOINTS="http://192.168.175.3:2379"
FLANNEL_ETCD_PREFIX="/k8s/network"
FLANNEL_OPTIONS="--iface=ens33" #设置自己的通信物理网卡
- 启动master上4个服务
命令:[root@master ~]# systemctl restart kube-apiserver kube-controller-manager kube-scheduler flanneld
命令:[root@master ~]# systemctl status kube-apiserver kube-controller-manager kube-scheduler flanneld
命令:[root@master ~]# systemctl enable kube-apiserver kube-controller-manager kube-scheduler flanneld
第三步,配置minion节点
- 配置flanneld服务
命令:[root@node1 ~]# vim /etc/sysconfig/flanneld
FLANNEL_ETCD_ENDPOINTS="http://192.168.175.3:2379"
FLANNEL_ETCD_PREFIX="/k8s/network"
FLANNEL_OPTIONS="--iface=ens33"
- 配置kube下的config
命令:[root@node1 ~]# vim /etc/kubernetes/config
KUBE_MASTER="--master=http://192.168.175.3:8080"
- 配置kubelet
命令:[root@node1 ~]# vim /etc/kubernetes/kubelet
KUBELET_ADDRESS="--address=0.0.0.0"
KUBELET_HOSTNAME="--hostname-override=node1"
KUBELET_API_SERVER="--api-servers=http://192.168.175.3:8080"
KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest"
- 启动node1服务
命令:[root@node1 ~]# systemctl restart flanneld kube-proxy kubelet docker
命令:[root@node1 ~]# systemctl enable flanneld kube-proxy kubelet docker
命令:[root@node1 ~]# systemctl status flanneld kube-proxy kubelet docker
- 在masters上运行 命令:[root@master ~]# kubectl get nodes 可以看到ready状态的node1
***至此k8s集群已经搭建完毕
第四步,从自己私有镜像库拉取镜像并部署服务
- 创建一个Deployment类型的yml文件,取名为k8s_deployment,yml,其内容如下
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: hello-k8s
spec:
replicas: 2
template:
metadata:
labels:
app: hello-k8s
spec:
containers:
- name: k8s
image: liuqiangdocker/qiangk8s:v1.0
ports:
- containerPort: 8888
- 创建一个service yml,取名为k8s_service.yml
apiVersion: v1
kind: Service
metadata:
name: hello-k8s
spec:
type: NodePort
ports:
- port: 8888
nodePort: 30001
selector:
app: hello-k8s
- 通过命令根据yml来创建并运行我们的容器
kubectl create -f k8s_deployment.yml
kubectl create -f k8s_service.yml
**********
特别特别注意:由于k8s版本更迭太快,1.5.2不支持apiVersion: apps/v1 service: Deployment,如果报 kind not match相关的很大可能是版本不对
- 查看master
我们可以用 kubectl get pod 来查看我们创建的容器,因为我在deployment里面,将replica设置为2
如果你发现你的pod处于ContainerCreating状态,可以用这个命令查看pod的细节 kubectl describe pod 你的pod名,主要看detail,我就出现这个问题
查了资料原来是这个目录是一个空目录,通过软链指过去的,这篇文章可以解决你的问题
转载 https://blog.csdn.net/weixin_37480442/article/details/81949217
- 你可以通过每个pod的clusterIP:端口号(是容器的端口号,不是nodePort,kubectl get service )来访问这个web服务
custerIP可以通过kubectl get Pods -o wide 获得 - 你也可以使用minion的ip地址加端口号(nodePort的端口号,就是外部端口)***不要用master的IP+端口,因为集群master不承担业务功能,只起到管理功能,业务由其他minion节点承担
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异