环境

安装参考前面几篇

主机节点cpu内存硬盘
192.168.233.140master124g30g
192.168.233.141node124g30g
192.168.233.142node224g30g
192.168.233.143harbor仓库24g30g

准备工作

143上面使用docker下载nginx的镜像,然后上传到harbor仓库。
镜像的话可以在https://hub.docker.com/上面找自己想要的镜像。

docker pull nginx:1.16.1

需要上传到该目录下,需要修改镜像的名称。
注意:harbor上面创建的项目需要为公开的。如public就是公开的,就是右边的访问级别,否则后期k8s在拉取镜像的时候会报错。可以点击左边的三个点进行设置
在这里插入图片描述

[root@hub ~]# docker images|grep nginx
nginx                                           1.16.1              dfcfd8e9a5d3        10 months ago       127MB
hub.bushro.com/public/nginx                     1.16.1              dfcfd8e9a5d3        10 months ago       127MB
vmware/nginx-photon                             1.11.13             2971c92cc1ae        3 years ago         200MB

更改名称

docker tag dfcfd8e9a5d3 hub.bushro.com/public/nginx:1.16.1

上传到harbor仓库

[root@hub harbor]# docker push hub.bushro.com/public/nginx:1.16.1
The push refers to repository [hub.bushro.com/public/nginx]
c23548ea0b99: Pushed 
82068c842707: Pushed 
c2adabaecedb: Pushed 
1.16.1: digest: sha256:2963fc49cc50883ba9af25f977a9997ff9af06b45c12d968b7985dc1e9254e4b size: 948

案例

案例:k8s上面创建多个pod,通过一个service来进行负载均衡。并把服务暴露出来。

创建deployment

创建nginx-deployment.yaml

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: hub.bushro.com/public/nginx:1.16.1
        ports:
        - containerPort: 80

这里的image是harbor仓库中的,docker会去harbor中拉取镜像下来。
前提:k8s集群中的每个节点的docker要去私有仓库(harbor)拉取镜像,需要先进行配置。

docker login https://hub.bushro.com
启动

–record参数可以记录命令,我们可以很方便的查每次revision的变化
deployment会自动为我们创建3个pod,因为我们在yaml中定义了。

[root@k8s-master1 ~]# kubectl apply -f nginx-deployment.yaml --record
deployment.extensions/nginx-deployment created
[root@k8s-master1 ~]# kubectl get pod -o wide -w|grep nginx
nginx-deployment-657494b55f-hxxgn   1/1     Running   0          15s     10.244.2.75   k8s-node2   <none>           <none>
nginx-deployment-657494b55f-kq8rf   1/1     Running   0          15s     10.244.1.60   k8s-node1   <none>           <none>
nginx-deployment-657494b55f-lqrbx   1/1     Running   0          15s     10.244.2.74   k8s-node2   <none>           <none>

service

Kubernetes Service 定义了这样一种抽象:一个Pod的逻辑分组,一种可以访问它们的策略——通常称为微服务。这一组Pod能够被Service访问到,通常是通过Label Selector

创建nginx-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: nginx-svc
spec:
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: 8080
      targetPort: 80
  • targetPort :pod端口
  • port:service用来负载均衡的端口
  • spec.selecttor.app需要和上面deployment中的labels.app一致,这样service才能知道要对谁进行负载。
启动service

service默认的类型:Clusterlp:自助分配一个仅Cluster内部可以访问的虚拟IP

[root@k8s-master1 ~]# kubectl apply -f nginx-service.yaml --record
service/nginx-svc created
[root@k8s-master1 ~]# kubectl get svc
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP        246d
myapp        NodePort    10.101.153.61   <none>        80:32051/TCP   217d
nginx-svc    ClusterIP   10.109.195.11   <none>        8080/TCP       14s

在这里插入图片描述

endpoint

endpoint是k8s集群中的一个资源对象,存储在etcd中,用来记录一个service对应的所有pod的访问地址。service配置selector,endpoint controller才会自动创建对应的endpoint对象;否则,不会生成endpoint对象.
例如,k8s集群中创建一个名为hello的service,就会生成一个同名的endpoint对象,ENDPOINTS就是service关联的pod的ip地址和端口。
在这里插入图片描述

服务发现
  • Pod内服务调用:localhost:容器内应用端口
  • Pod间服务调用:服务名.namespace名:服务端口
  • 外部服务调用∶负载均衡器IP:负载均衡器内映射端口或Ingress URL

在外面想通过服务名.namespace名:服务端口的形式进行访问,是没办法进行的。因为namespace名默认为default,没有dns解析是识别不到的。pod内部有可以解析。可以启动一个pod然后进里面验证下服务发现。

bosybox是一个工具,非常小。直接启动它来验证。

kubectl run busybox --rm -it --image=busybox /bin/sh

在这里插入图片描述
这告诉我们在kubectl的任何pod里面都可以通过服务名.namespace名:服务端口的方式进行访问。这就是pod之间的服务发现,内部之间进行通信就通过这种方式。

默认的clusterIp的方式是无法对外提供服务的。我们进行修改下让它能够对外提供服务。
修改nginx-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: nginx-svc
spec:
  type: NodePort
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: 8080
      targetPort: 80
      nodePort: 30000

nodePort的取值范围在:30000-32767

重新启动
在这里插入图片描述
在外面进行访问,三台都可以访问到。
在这里插入图片描述

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐