16 Jan 2018
参考链接:kubenetes 官方文档
执行以下操作之前,可以参照文档先创建一个kubenetes cluster
redis-master-deployment.yaml
apiVersion: apps/v1beta2 # for versions before 1.8.0 use apps/v1beta1 kind: Deployment metadata: name: redis-master spec: selector: matchLabels: app: redis role: master tier: backend replicas: 1 template: metadata: labels: app: redis role: master tier: backend spec: containers: - name: master image: k8s.gcr.io/redis:e2e # or just image: redis resources: requests: cpu: 100m memory: 100Mi ports: - containerPort: 6379
通过selector中的mathLabels和pod的labels匹配联系在一起
kubectl apply -f redis-master-deployment.yaml
kubectl get pods
NAME READY STATUS RESTARTS AGE
redis-master-585798d8ff-lqw5t 1/1 Running 0 19m
kubectl logs -f redis-master-585798d8ff-lqw5t
redis-master-service.yaml
apiVersion: v1 kind: Service metadata: name: redis-master labels: app: redis role: master tier: backend spec: ports: - port: 6379 targetPort: 6379 selector: app: redis role: master tier: backend
通过selector和pod的labels匹配联系在一起
kubectl apply -f redis-master-service.yaml kubectl get service NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.254.0.1 <none> 443/TCP 1d redis-master ClusterIP 10.254.184.211 <none> 6379/TCP 6s
创建Redis slave来组成redis集群
redis-slave-deployment.yaml
apiVersion: apps/v1beta2 kind: Deployment metadata: name: redis-slave spec: selector: matchLabels: app: redis role: slave tier: backend replicas: 2 template: metadata: labels: app: redis role: slave tier: backend spec: containers: - name: slave image: gcr.io/google_samples/gb-redisslave:v1 resources: requests: cpu: 100m memory: 100Mi env: - name: GET_HOSTS_FROM value: env ports: - containerPort: 6379
Using
GET_HOSTS_FROM=dnsrequires your cluster to
provide a dns service. As of Kubernetes 1.3, DNS is a built-in
service launched automatically. However, if the cluster you are using
does not have a built-in DNS service, you can instead
instead access an environment variable to find the master
service’s host. To do so, comment out the ‘value: dns’ line above, and
uncomment the line below:
value: envredis slave 是通过下面的命令来和redis-master这个service建立的连接
if [[ ${GET_HOSTS_FROM:-dns} == "env" ]]; then redis-server --slaveof ${REDIS_MASTER_SERVICE_HOST} 6379 else redis-server --slaveof redis-master 6379 fi
kubectl apply -f redis-slave-deployment.yaml kubectl get pods NAME READY STATUS RESTARTS AGE redis-master-585798d8ff-lqw5t 1/1 Running 0 35m redis-slave-865486c9df-254jt 1/1 Running 0 6m redis-slave-865486c9df-qczr9 1/1 Running 0 6m
redis-slave-service.yaml
apiVersion: v1 kind: Service metadata: name: redis-slave labels: app: redis role: slave tier: backend spec: ports: - port: 6379 selector: app: redis role: slave tier: backend
kubectl apply -f redis-slave-service.yaml kubectl get services NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.254.0.1 <none> 443/TCP 1d redis-master ClusterIP 10.254.184.211 <none> 6379/TCP 18m redis-slave ClusterIP 10.254.251.186 <none> 6379/TCP 5s
guestbook应用是用php编写的一个处理http请求的web前端程序,调用redis-master(写)和redis-slave(读)。
frontend-deployment.yaml
apiVersion: apps/v1beta2 kind: Deployment metadata: name: frontend spec: selector: matchLabels: app: guestbook tier: frontend replicas: 3 template: metadata: labels: app: guestbook tier: frontend spec: containers: - name: php-redis image: gcr.io/google-samples/gb-frontend:v4 resources: requests: cpu: 100m memory: 100Mi env: - name: GET_HOSTS_FROM value: env ports: - containerPort: 80
Using
GET_HOSTS_FROM=dnsrequires your cluster to
provide a dns service. As of Kubernetes 1.3, DNS is a built-in
service launched automatically. However, if the cluster you are using
does not have a built-in DNS service, you can instead
instead access an environment variable to find the master
service’s host. To do so, comment out the ‘value: dns’ line above, and
uncomment the line below:
value: env
kubectl apply -f frontend-deployment.yaml kubectl get pods -l app=guestbook -l tier=frontend NAME READY STATUS RESTARTS AGE frontend-656ff8f48f-4zt9q 1/1 Running 0 18m frontend-656ff8f48f-gfz5w 1/1 Running 0 18m frontend-656ff8f48f-qvhwk 1/1 Running 0 18m
frontend-service.yaml
apiVersion: v1 kind: Service metadata: name: frontend labels: app: guestbook tier: frontend spec: type: NodePort ports: - port: 80 selector: app: guestbook tier: frontend
comment or delete
type: NodePortif you want to use a LoadBalancer
if your cluster supports it, uncomment the following to automatically create
an external load-balanced IP for the frontend service.
type: LoadBalancerfrontend是通过
guestbook.php中的$host = 'redis-slave'和$host = 'redis-master'来和redis建立的联系
kubectl apply -f frontend-service.yaml kubectl get services NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE frontend NodePort 10.254.217.166 <none> 80:40751/TCP 5s kubernetes ClusterIP 10.254.0.1 <none> 443/TCP 1d redis-master ClusterIP 10.254.184.211 <none> 6379/TCP 46m redis-slave ClusterIP 10.254.251.186 <none> 6379/TCP 28m
kubectl get services frontend NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE frontend NodePort 10.254.217.166 <none> 80:40751/TCP 4m
因为我们是使用的NodePort方式转发的service,所以我们只需要在浏览器中访问cluster中的任意一个node ip:40751就可以了
kubectl delete deployment -l app=redis kubectl delete service -l app=redis kubectl delete deployment -l app=guestbook kubectl delete service -l app=guestbook