在手动安装 Kubernetes 的基础上搭建微服务

需要用到的镜像

  • redis-master: 用于前端 Web 应用进行“写”留言操作的 Redis 服务,其中已经保存了一条内容为“Hello World!”的留言。
  • guestbook-redis-slave: 用于前端 Web 应用进行读留言操作的 Redis 服务,并与 Redis-Master的数据保持同步
  • guestbook-php-frontend:php Web 服务,在网页上展示留言的内容,也提供一个文本输入框供访客添加留言

创建 redis-master RC 和 Service

先定义 Service,然后顶一个 RC 来控制相关联的 Pod,或者先定义 RC 来创建 Pod,然后定义与之关联的 Service,这里采用后一种方法。

首先为 redis-master 创建一个名为 redis-master 的 RC 定义文件 redis-master-controller.yaml

apiVersion: v1
kind: ReplicationController
metadata:
  name: redis-master
  labels:
    name: redis-master
spec:
  replicas: 1
  selector:
    name: redis-master
  template:
    metadata:
      labels:
        name: redis-master
    spec:
      containers:
      - name: master
        image: kubeguide/redis-master
        ports:
        - containerPort: 6379
  • kind 字段的值为“ReplicationController”,表示这是一个 RC
  • spec.selector 是 RC 的 Pod 选择器,即监控和管理拥有这些标签的 Pod 实例,确保集群上始终有且仅有 replicas 个Pod 实例在运行

创建好 redis-master-controller.yaml 文件后,在 Master 节点执行命令:

kubectl create -f redis-master-controller.yaml

将它发布到 Kubernetes 集群中,就完成了 redis-master 的创建过程。

# 查看刚刚创建 redis-master
kubect get rc
# Kubernetes 会人居 redis-master 这个 rc 的定义自动创建 Pod
kubectl get pods

Pods 创建好了之后,接下来就创建与之相关的 Service:redis-master-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: redis-master
  labels:
    name: redis-master
spec:
  ports:
  - port: 6379
    targetPort: 6379
  selector:
    name: redis-master
  • metadata.name 是 Service的服务名
  • spec.selector 确定了选择哪些 Pod, 这里用name=redis-master 标签的 Pod
  • port 属性定义的是 Service 的虚拟端口号
  • targetPort 属性指定的是 Pod 内容器应用监听的端口号

运行 kubectl create 创建该 Service


# 创建
kubectl create -f redis-master-service.yaml
# 查看创建的 Service
kubectl get services

redis-master 服务分配了一个值为 虚拟IP地址,随后 Kubernetes 集群中的其他新创建的 Pod 就可以通过这个虚拟 IP + 端口 6379 来访问这个服务了

但是由于 IP 地址是在服务创建后 由 Kubernetes 系统自动分配的,在其他 Pod 中无法预先知道某个 Service的 虚拟 IP地址,因此需要一个机制来找到这个服务。

Kubernetes 巧妙地使用了Linux 的环境变量,在每个 Pod 的容器都增加了一组 Service 相关的环境变量,用来记录从服务名到虚拟IP地址的映射关系。

以 redis-master 为例,在容器的环境变量中会增加下面两条记录:

REDIS_MASTER_SERVICE_HOST=169.169.144.74
REDIS_MASTER_SERVICE_PORT=6379

创建 redis-slave RC 和 Service

redis-slave-controller.yaml

扫描二维码关注公众号,回复: 6187831 查看本文章
apiVersion: v1
kind: ReplicationController
metadata:
  name: redis-slave
  labels:
    name: redis-slave
spec:
  replicas: 2
  selector:
    name: redis-slave
  template:
    metadata:
      labels:
        name: redis-slave
    spec:
      containers:
      - name: slave
        image: kubeguide/guestbook-redis-slave
        env:
        - name: GET_HOSTS_FROM
          value: env
        ports:
        - containerPort: 6379

在容器的配置部分设置了一个 环境变量 GET_HOST_FROM=env,意思是从环境变量中获取 redis-master 服务的 IP 信息

如果在容器配置部分不设置该env,则将使用 redis-master 服务的名称 “redis-master”来访问它,这将使用 DNS 的方式 发现服务,需要预先启动 Kubernetes 集群中的 skydns 服务。

kubectl create -f redis-slave-controller.yaml

kubectl get rc

redis-slave-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: redis-slave
  labels:
    name: redis-slave
spec:
  ports:
  - port: 6379
  selector:
    name: redis-slave

运行 Kubernetes 创建 Service

kubectl create -f redis-slave-service.yaml

kubectl get services

创建 frontend RC 和 Service

定义 frontend 的 RC 配置文件: frontend-controller.yaml

apiVersion: v1
kind: ReplicationController
metadata:
  name: frontend
  labels:
    name: frontend
spec:
  replicas: 3
  selector:
    name: frontend
  template:
    metadata:
      labels:
        name: frontend
    spec:
      containers:
      - name: frontend
        image: kubeguide/guestbook-php-frontend
        env:
        - name: GET_HOSTS_FROM
          value: env
        ports:
        - containerPort: 80
kubectl create -f frontend-controller.yaml

frontend-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: frontend
  labels:
    name: frontend
spec:
  type: NodePort
  ports:
  - port: 80
    nodePort: 30001
  selector:
    name: frontend

设置 type=NodePort 并指定一个 NodePort 的值,表示使用 Node 上的物理机端口提供对外的的访问服务,需要注意的是 spec.ports.NodePort 的端口号范围可以进行限制,--service-node-port-range 指定,默认是 30000-32767,如果是其他范围的端口号,则 Service 创建失败。

kubectl create -f frontend-service.yaml
kubectl get services

猜你喜欢

转载自www.cnblogs.com/tuhooo/p/10843418.html