docker整合k8s的简单使用

简单的使用流程​​:

  1. ​使用 Docker 构建镜像​
  2. ​将镜像推送到镜像仓库(如 Docker Hub 或私有仓库)​
  3. ​编写 Kubernetes YAML 文件(如 Deployment 和 Service)​
  4. ​在 Kubernetes 集群中部署应用​

一、前提条件

在开始之前,请确保你已具备以下环境:

  • 已安装 ​​Docker​
  • 已安装 ​​Kubernetes 集群​​(可以是本地的如 ​​Minikube​​、​​Kind​​,或远程集群如 ​​kubeadm 搭建的集群​​、​​EKS/GKE/AKS 等云服务​​)
  • 已配置 ​​kubectl​​ 并能连接到你的 Kubernetes 集群
  • (可选但推荐)拥有一个 ​​Docker 镜像仓库账号​​(如 Docker Hub)

如果你只是本地测试,推荐使用 Minikube或 Kind快速启动一个本地 Kubernetes 环境。

二、步骤一:使用 Docker 构建镜像

假设我们有一个简单的 Web 应用,比如一个基于 Python Flask 的 “Hello World” 应用。

1. 项目结构示例

./k8s
├── deployment.yaml
└── service-nodeport.yaml
  • deployment.yaml内容:
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-docker-k8s-app
spec:
  replicas: 2
  selector:
    matchLabels:
      app: my-docker-k8s-app
  template:
    metadata:
      labels:
        app: my-docker-k8s-app
    spec:
      containers:
      - name: app
        image: 172.18.214.116:5000/hello-java-web:latest # 镜像为本地部署的registry私有仓库镜像
        ports:
        - containerPort: 8080
  • service-nodeport.yaml内容:
apiVersion: v1
kind: Service
metadata:
  name: my-k8s-app-service
spec:
  type: NodePort
  selector:
    app: my-docker-k8s-app
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
      nodePort: 30080  # 可选,范围 30000~32767

四、步骤三:部署到 Kubernetes 集群

1. 应用 Deployment

kubectl apply -f deployment.yaml

2. 应用 Service

kubectl apply -f service-nodeport.yaml

3. 检查资源状态

kubectl get pods
kubectl get deployments
kubectl get services

你应该能看到你的 Pod 处于 ​​Running​​ 状态,以及 Service 已创建,比如:

NAME                                TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
my-docker-k8s-app-service           NodePort    10.96.xxx.xxx   <none>        80:30007/TCP   1m

可能会有

启动失败情况,可以查看日志进而解决:

kubectl describe pod my-docker-k8s-app-867554b74b-9bqxp

显示:

可以看到:
Failed to pull image “172.18.214.116:5000/hello-java-web:latest”: Error response from daemon: Get “https://172.18.214.116:5000/v2/”:

项目是从https仓库去拉取镜像,但是咱们是http的,所以需要进行处理一下,参考之前的文章:
Docker配置私有仓库+minikube拉取 – 简单的站

$ minikube ssh
$ sudo vi /usr/lib/systemd/system/docker.service
在ExecStart=的语句最后添加:--insecure-registry  registry_ip:5000
$ sudo systemctl daemon-reload 
$ sudo systemctl restart docker

处理后退出minikube的ssh,ctrl+D

删除原来的deployment:

kubectl delete pod my-docker-k8s-app-*

重新部署
kubectl apply -f deployment.yaml
kubectl apply -f service-nodeport.yaml

查看状态正常:

宿主机访问应用:​

minikube ip
curl http://192.168.58.2:30080/hello

表示已经部署完毕, 但是此时宿主机的其他局域网机器无法访问需要做,端口转发或者nginx反向代理,此处使用端口转发:

k8s的端口内部规则为:

将 Pod 的 8080 → Service 的 80 → 映射到 Node(宿主机)的 30080 端口​

需要使用 socat(简单、无需安装 nginx)

如果你的宿主机支持 socat,运行如下命令:

sudo socat TCP-LISTEN:30080,bind=0.0.0.0,fork TCP:192.168.58.2:30080

如果需要后台运行,需要执行:

sudo socat TCP-LISTEN:30080,bind=0.0.0.0,fork TCP:192.168.58.2:30080 &

如果你没有 socat?可以安装它:

sudo apt install socat

至此结束

Previous Post Next Post

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注