k8s容器,并供外部访问;

本文详细介绍如何在Kubernetes中通过命令行和配置文件方式部署Nginx与Java应用,并实现服务的内外网访问。包括使用NodePort暴露端口、配置文件编写、服务间通信等关键步骤。

 

 

1.以命令方式启动一个deployment和service:

kubectl run mynginx --image=nginx --replicas=2 

kubectl expose deployment mynginx --type=NodePort --name=nginx --port=80

第一个命令是创建名字为mynginx的两个pod的调度任务;

第二个是发布这个调度任务为service,并且使用NodePort方式暴露端口,其中供k8s内网使用的端口为80;

你就会看到如下:

NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
nginx        NodePort    10.99.14.135   <none>        80:30001/TCP   8m

注意,这个供外部访问的30001是动态生成的;

___接下来你可以使用http://192.168.134.131:30001访问nginx了.这个是我虚拟机的ip;

 

2.使用配置文件方式:

命令是:

kubectl create -f 你的两个yml文件

deployment:

apiVersion: apps/v1     //相应版本,根据k8s的版本
kind: Deployment 
metadata: 
  name: nginx
spec: 
  selector:
      matchLabels:
         app: nginx        //这个在我这1.10.2版本必须有这个,就是个选择器筛选吧
  replicas: 2            //启动俩
  template: 
    metadata: 
      labels: 
        app: nginx
    spec: 
      containers: 
        - name: nginx
          image: nginx
          ports:
          - containerPort: 80        //相当于容器本身暴露的端口,不写貌似也暴露

 

service:

apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  type: NodePort        //这里使用节点暴露端口方式
  ports:
  - port: 8888           //这个是供内网访问的端口
    targetPort: 80        //这个是与容器暴露的端口一致,不写好像也可以
    nodePort: 30001        //这个就是提供给外部和个节点访问的了
  selector:
    app: nginx

 

出来的结果:

NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
nginx        NodePort    10.99.14.135   <none>        8888:30001/TCP   13m

 

这玩意卡我好久....用配置文件的方式咋都不行...最近有点蒙圈;

 

 

 

___________________________________________________________________________

部署一个java和nginx,并且nginx访问java~今天又解决一堆坑:

1.编写service和deployment的yml配置文件(之前写一起了,现在觉得还是分开比较好)

java:

apiVersion: apps/v1
kind: Deployment 
metadata: 
  name: java-deployment
spec: 
  selector:
      matchLabels:
         app: java
  replicas: 1
  template: 
    metadata: 
      labels: 
        app: java
    spec: 
      nodeSelector:
           node: node1
      containers: 
        - name: java
          image: app:v1
          ports: 
          - containerPort: 8080
apiVersion: v1
kind: Service
metadata:
  name: java-service
spec:
  type: NodePort
  ports:
  - port: 8080
    targetPort: 8080
  selector:
      app: java

nginx:

kind: Deployment 
metadata: 
  name: nginx-deployment
spec: 
  selector:
      matchLabels:
         app: nginx
  replicas: 1
  template: 
    metadata: 
      labels: 
        app: nginx
    spec: 
      nodeSelector:
          node: node1
      containers: 
        - name: nginx
          image: mynginx:v1
          ports:
          - containerPort: 80
          volumeMounts:
          - mountPath: /etc/nginx/conf.d/default.conf
            name: conf
            subPath: default.conf
      volumes:
        - name: conf
          hostPath:
           path: /home/gao/conf.d/

注意的是我这版本的如果挂载文件的话,需要使用subPath来声明文件名称;如果挂载的是文件夹,那么可以去掉subPath,相应的挂载目录也就到文件夹:

 

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  type: NodePort
  ports:
  - port: 8888
    targetPort: 80
    nodePort: 30001
  selector:
      app: nginx
server {
    listen       80;
    server_name  localhost;


    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
    location /api {
       # proxy_pass http://client/api;
        proxy_pass http://java-service:8080/api;
    }
   
}

这里的转发的java地址是service的名称,这样就能动态解析到java的ip;当然我之前使用ClusterIP也可以访问到java,但是遇到的问题就是高频次的出现502.....

 

在 Kubernetes 中,从集群外部访问容器化服务是常见的需求,例如暴露 Web 应用、API 服务等。Kubernetes 提了多种方式来实现这一目标,每种方法都有其适用场景和优缺点。 ### Service 类型 #### NodePort `NodePort` 是一种基础的暴露服务的方式。通过将 Service 的 `type` 设置为 `NodePort`,Kubernetes 会在每个节点上开放一个特定端口将该端口上的流量转发到后端 Pod。这种方式适合测试环境或小型部署[^2]。 ```yaml apiVersion: v1 kind: Service metadata: name: my-nodeport-service spec: type: NodePort selector: app: MyApp ports: - protocol: TCP port: 80 targetPort: 8080 ``` #### LoadBalancer 对于运行在云平台(如 AWS、GCP 或 Azure)上的 Kubernetes 集群,可以使用 `LoadBalancer` 类型的服务。这会自动创建一个外部负载均衡器,将其 IP 地址与服务关联起来[^3]。 ```yaml apiVersion: v1 kind: Service metadata: name: my-loadbalancer-service spec: type: LoadBalancer selector: app: MyApp ports: - protocol: TCP port: 80 targetPort: 8080 ``` #### Ingress `Ingress` 是一种更高级的方法,用于管理对集群中服务的 HTTP 路由。它通常与 Ingress 控制器一起工作,以提基于路径或主机名的路由规则,支持 SSL 终止等功能[^4]。 ```yaml apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: my-ingress spec: rules: - http: paths: - path: /app pathType: Prefix backend: service: name: my-service port: number: 80 ``` ### 其他方法 #### ExternalName `ExternalName` 类型的服务允许将服务映射到 DNS 名称,而不是典型的选择器-标签机制。这对于访问集群外部的服务非常有用,例如数据库或其他 API 服务[^1]。 ```yaml apiVersion: v1 kind: Service metadata: name: my-externalname-service spec: type: ExternalName externalName: example.com ports: - port: 80 ``` #### HostNetwork 某些情况下,可以通过设置 Pod 使用主机网络 (`hostNetwork: true`) 来直接暴露容器端口。这种方法绕过了 Kubernetes 网络模型,适用于需要高性能或直接访问主机网络的场景。 #### Port Forwarding `kubectl port-forward` 命令可用于临时将本地机器的一个端口转发到集群中的 Pod 或 Service,非常适合调试目的。 #### Cloud Provider Specific Solutions 除了标准的 `LoadBalancer` 类型之外,一些云提商还提了额外的功能,比如自定义健康检查、SSL 配置等,这些都可以进一步增强对外访问的支持。 ---
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值