k8s容器,并供外部访问;

/ 运维 / 没有评论 / 397浏览


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.....