代码改变世界

《Kubernetes权威指南:从Docker到Kubernetes实践全接触》学习实验记录-不简单的Hello World

2019-01-15 00:18  it长青  阅读(303)  评论(0)    收藏  举报

如何从hub.docker.com下载教程中的镜像地址在 : https://hub.docker.com/u/kubeguide/

把实验中要的3个镜像导入到环境中

guestbook-php-frontend.tar
redis-master.tar
redis-slave.tar

[root@k8s_master src]# ll -h
total 1.1G
-rwxr-xr-x 1 root root 511M Dec 10 09:50 guestbook-php-frontend.tar
-rwxr-xr-x 1 root root 418M Dec 10 09:56 redis-master.tar
-rwxr-xr-x 1 root root 111M Dec 10 09:57 redis-slave.tar
[root@k8s_master src]# 

docker load -i guestbook-php-frontend.tar
docker load -i redis-master.tar
docker load -i redis-slave.tar

[root@k8s_master src]# docker images
REPOSITORY                                                 TAG      IMAGE ID                CREATED           SIZE
172.16.111.200:5000/httpd                              v1          b92a0eb0b729          34 hours ago      364 MB
httpd                                                                 v1          b92a0eb0b729          34 hours ago      364 MB
docker.io/registry                                              latest     2e2f252f3c88 2         months ago         33.3 MB
172.16.111.200:5000/centos                            v            85b2308e24e6          6 months ago      199 MB
172.16.111.200:5000/pod-infrastructure          latest      ee020ceeef01          2 years ago      215 MB
docker.io/kubeguide/guestbook-php-frontend  latest     7e2f36e67a84          3 years ago      510 MB
docker.io/kubeguide/redis-master                     latest    405a0b586f7e          3 years ago      419 MB
docker.io/kubeguide/guestbook-redis-slave      latest    e0c36a1fa372          3 years ago 1    10 MB

上传到自己的私有仓库中

[root@k8s_master src]# docker tag 7e2f36e67a84 172.16.111.200:5000/guestbook-php-frontend:latest
[root@k8s_master src]# docker push 172.16.111.200:5000/guestbook-php-frontend:latest
[root@k8s_master src]# docker tag 405a0b586f7e 172.16.111.200:5000/redis-master:latest
[root@k8s_master src]# docker push 172.16.111.200:5000/redis-master:latest
[root@k8s_master src]# docker tag e0c36a1fa372 172.16.111.200:5000/guestbook-redis-slave:latest
[root@k8s_master src]# docker push 172.16.111.200:5000/guestbook-redis-slave:latest

----

第1个实验:从一个不简单的 Hello World 例子说起

创建redis master 的 rc

[root@k8s_master ~]# cat master.yaml
apiVersion: v1
kind: ReplicationController
metadata:
  name: redis-master
  labels:
    name: redis-master-lab
spec:
  replicas: 1
  selector:
    name: redismas-lab
  template:
    metadata:
      name: redismas-tem
      labels:
        name: redismas-lab
    spec:
      containers:
      - name: redismas-con
        image: 172.16.111.200:5000/redis-master
        ports:
        - containerPort: 6379
    
[root@k8s_master ~]# 
[root@k8s_master ~]# kubectl create -f master.yaml -s master:8080
replicationcontroller "redis-master" created
[root@k8s_master ~]# 
[root@k8s_master ~]# kubectl get rc
NAME DESIRED CURRENT READY AGE
redis-master 1 1 1 37s
[root@k8s_master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
redis-master-gnxk0 1/1 Running 0 1m
[root@k8s_master ~]#

创建redis master 的 service

[root@k8s_master ~]# cat redis-master-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: redis-master
  labels:
    name: redis-master-lab
spec:
  ports:
  - port: 6379
    targetPort: 6379
  selector:
    name: redismas-lab # pod的标签

[root@k8s_master ~]# kubectl create -f redis-master-service.yaml -s master:8080
service "redis-master" created
[root@k8s_master ~]# kubectl get rc
NAME DESIRED CURRENT READY AGE
redis-master 1 1 1 13m
[root@k8s_master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
redis-master-gnxk0 1/1 Running 0 13m
[root@k8s_master ~]# 

它被分配到 node2上

[root@k8s_node2 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e3e847dc7a6b 172.16.111.200:5000/redis-master "redis-server /etc..." 14 minutes ago Up 14 minutes k8s_redismas-con.f9050704_redis-master-gnxk0_default_d7d4b85a-fc90-11e8-9a1d-000c29bd7985_a35f8b74
f95dafbe97cb 172.16.111.200:5000/pod-infrastructure:latest "/pod" 14 minutes ago Up 14 minutes k8s_POD.93820324_redis-master-gnxk0_default_d7d4b85a-fc90-11e8-9a1d-000c29bd7985_38c8d0b9
[root@k8s_node2 ~]#

创建redis slave 的 rc

[root@k8s_master ~]# cat redis-slave.yaml 
apiVersion: v1
kind: ReplicationController
metadata:
  name: redis-slave
  labels:
    name: redis-slave-lab
spec:
  replicas: 2
  selector:
    name: redis-slave-lab
  template:
    metadata:
      name: redis-slave-tem
      labels:
        name: redis-slave-lab
    spec:
      containers:
      - name: redis-slave-con
        image: 172.16.111.200:5000/guestbook-redis-slave
        ports:
        - containerPort: 6379
    
[root@k8s_master ~]# 
[root@k8s_master ~]# kubectl create -f redis-slave.yaml 
replicationcontroller "redis-slave" created
[root@k8s_master ~]# 
[root@k8s_master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
redis-master-gnxk0 1/1 Running 0 21m
redis-slave-2t4sg 1/1 Running 0 9s
redis-slave-4g7m6 1/1 Running 0 9s
[root@k8s_master ~]# 

到node节点上查看

[root@k8s_node1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f516c7cfdc46 172.16.111.200:5000/guestbook-redis-slave "/entrypoint.sh /b..." 2 minutes ago Up 2 minutes k8s_redis-slave-con.1fc30b9a_redis-slave-4g7m6_default_e235cd36-fc93-11e8-9a1d-000c29bd7985_4c8dced1
8825ea682231 172.16.111.200:5000/pod-infrastructure:latest "/pod" 2 minutes ago Up 2 minutes k8s_POD.93820324_redis-slave-4g7m6_default_e235cd36-fc93-11e8-9a1d-000c29bd7985_cbbb0f29
[root@k8s_node1 ~]# 

进到容器实例中查看到环境变量参数

[root@k8s_node1 ~]# docker exec -ti f516c7cfdc46 /bin/bash
root@redis-slave-4g7m6:/data# env | grep REDIS_MASTER
REDIS_MASTER_PORT_6379_TCP_ADDR=10.254.93.254
REDIS_MASTER_PORT_6379_TCP=tcp://10.254.93.254:6379
REDIS_MASTER_SERVICE_PORT=6379
REDIS_MASTER_SERVICE_HOST=10.254.93.254
REDIS_MASTER_PORT_6379_TCP_PORT=6379
REDIS_MASTER_PORT_6379_TCP_PROTO=tcp
REDIS_MASTER_PORT=tcp://10.254.93.254:6379
root@redis-slave-4g7m6:/data# 

那它怎么从master同步数据呢

root@redis-slave-4g7m6:/data# cat /run.sh 
#!/bin/bash

# Copyright 2014 The Kubernetes Authors All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

if [[ ${GET_HOSTS_FROM:-dns} == "env" ]]; then
  redis-server --slaveof ${REDIS_MASTER_SERVICE_HOST} 6379
else
  redis-server --slaveof redis-master 6379
fi
root@redis-slave-4g7m6:/data# 

在 /run.sh 这个文件里设置同步行为,并是从 env 变量中找到同步数据源的 master

自定义环境变量

[root@k8s_master ~]# cat redis-slave.yaml 
apiVersion: v1
kind: ReplicationController
metadata:
  name: redis-slave
  labels:
    name: redis-slave-lab
spec:
  replicas: 2
  selector:
    name: redis-slave-lab
  template:
    metadata:
      name: redis-slave-tem
      labels:
        name: redis-slave-lab
    spec:
      containers:
      - name: redis-slave-con
        image: 172.16.111.200:5000/guestbook-redis-slave
        env:
        - name: GET_HOSTS_FROM
          value: env
        ports:
        - containerPort: 6379
    
[root@k8s_master ~]# 
[root@k8s_master ~]# kubectl delete rc redis-slave
replicationcontroller "redis-slave" deleted
[root@k8s_master ~]# kubectl get rc
NAME DESIRED CURRENT READY AGE
redis-master 1 1 1 35m
[root@k8s_master ~]# kubectl create -f redis-slave.yaml 
replicationcontroller "redis-slave" created
[root@k8s_master ~]# kubectl get rc
NAME DESIRED CURRENT READY AGE
redis-master 1 1 1 35m
redis-slave 2 2 2 4s
[root@k8s_master ~]# 

查看pod的日志, kubectl logs podname

[root@k8s_master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
redis-master-gnxk0 1/1 Running 0 37m
redis-slave-3x3m0 1/1 Running 0 1m
redis-slave-9btjh 1/1 Running 0 1m
[root@k8s_master ~]# kubectl logs redis-slave-3x3m0
                _._                                                  
           _.-``__ ''-._                                             
      _.-`` `. `_. ''-._ Redis 3.0.3 (00000000/0) 64 bit
  .-`` .-```. ```\/ _.,_ ''-._                                   
 ( ' , .-` | `, ) Running in standalone mode
 |`-._`-...-` __...-.``-._|'` _.-'| Port: 6379
 | `-._ `._ / _.-' | PID: 6
  `-._ `-._ `-./ _.-' _.-'                                   
 |`-._`-._ `-.__.-' _.-'_.-'|                                  
 | `-._`-._ _.-'_.-' | http://redis.io        
  `-._ `-._`-.__.-'_.-' _.-'                                   
 |`-._`-._ `-.__.-' _.-'_.-'|                                  
 | `-._`-._ _.-'_.-' |                                  
  `-._ `-._`-.__.-'_.-' _.-'                                   
      `-._ `-.__.-' _.-'                                       
          `-._ _.-'                                           
              `-.__.-'                                               
6:S 10 Dec 16:08:32.158 # Server started, Redis version 3.0.3
6:S 10 Dec 16:08:32.158 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.
6:S 10 Dec 16:08:32.158 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
6:S 10 Dec 16:08:32.158 * The server is now ready to accept connections on port 6379
6:S 10 Dec 16:08:33.143 * Connecting to MASTER 10.254.93.254:6379
6:S 10 Dec 16:08:33.147 * MASTER <-> SLAVE sync started
6:S 10 Dec 16:09:34.474 # Timeout connecting to the MASTER...
6:S 10 Dec 16:09:34.474 * Connecting to MASTER 10.254.93.254:6379
6:S 10 Dec 16:09:34.480 * MASTER <-> SLAVE sync started
[root@k8s_master ~]# 

Timeout connecting to the MASTER.. 这句说连接超时

排查是因为 运行 redis-master 的节点防火墙没关

[root@k8s_node2 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
40713b5771a2 172.16.111.200:5000/guestbook-redis-slave "/entrypoint.sh /b..." 46 hours ago Up 46 hours k8s_redis-slave-con.24aa2769_redis-slave-9btjh_default_d6c906ba-fc95-11e8-9a1d-000c29bd7985_bc12f8c4
8dc486712a0c 172.16.111.200:5000/pod-infrastructure:latest "/pod" 46 hours ago Up 46 hours k8s_POD.93820324_redis-slave-9btjh_default_d6c906ba-fc95-11e8-9a1d-000c29bd7985_36c78f73
e3e847dc7a6b 172.16.111.200:5000/redis-master "redis-server /etc..." 46 hours ago Up 46 hours k8s_redismas-con.f9050704_redis-master-gnxk0_default_d7d4b85a-fc90-11e8-9a1d-000c29bd7985_a35f8b74
f95dafbe97cb 172.16.111.200:5000/pod-infrastructure:latest "/pod" 46 hours ago Up 46 hours k8s_POD.93820324_redis-master-gnxk0_default_d7d4b85a-fc90-11e8-9a1d-000c29bd7985_38c8d0b9
[root@k8s_node2 ~]# 

[root@k8s_node2 ~]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens33
  sources: 
  services: dhcpv6-client ssh
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  sourceports: 
  icmp-blocks: 
  rich rules: 
	
[root@k8s_node2 ~]# 

关闭 node2的防火墙后

6:S 12 Dec 14:11:06.595 * MASTER <-> SLAVE sync: receiving 43 bytes from master
6:S 12 Dec 14:11:06.596 * MASTER <-> SLAVE sync: Flushing old data
6:S 12 Dec 14:11:06.596 * MASTER <-> SLAVE sync: Loading DB in memory
6:S 12 Dec 14:11:06.596 * MASTER <-> SLAVE sync: Finished with success

Finished with success 同步成功

查看容器镜像详情

[root@k8s_master ~]# docker inspect 172.16.111.200:5000/guestbook-redis-slave
[
    {
        "Id": "sha256:e0c36a1fa3729ffc83adbd3002cad7b1d42a78d94d410f3c1e9745d08d857e06",
        "RepoTags": [
            "172.16.111.200:5000/guestbook-redis-slave:latest",
            "docker.io/kubeguide/guestbook-redis-slave:latest"
        ],
        "RepoDigests": [
            "172.16.111.200:5000/guestbook-redis-slave@sha256:1d49907a3e19f8659a780b4589b24b4ad82932a854d4fc643dc12f210c354fca"
        ],
        "Parent": "",
        "Comment": "",
        "Created": "2015-08-10T18:41:39.652053454Z",
        "Container": "409f79a582540b11a87dc7ee1d5d5d591f1a1ed198a9bff8724392d03c3ce51a",
        "ContainerConfig": {
            "Hostname": "c2712433a4da",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "ExposedPorts": {
                "6379/tcp": {}
            },
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                "REDIS_VERSION=3.0.3",
                "REDIS_DOWNLOAD_URL=http://download.redis.io/releases/redis-3.0.3.tar.gz",
                "REDIS_DOWNLOAD_SHA1=0e2d7707327986ae652df717059354b358b83358"
            ],
            "Cmd": [
                "/bin/sh",
                "-c",
                "#(nop) CMD [/bin/sh -c /run.sh]"
            ],
            "Image": "38ab071f612493647a8bdaf82c918538558d9ec3103163cbd11f0f6565f8f4a1",
            "Volumes": {
                "/data": {}
            },
            "WorkingDir": "/data",
            "Entrypoint": [
                "/entrypoint.sh"
            ],
            "OnBuild": [],
            "Labels": null
        },
        "DockerVersion": "1.4.1",
        "Author": "",
        "Config": {
            "Hostname": "c2712433a4da",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "ExposedPorts": {
                "6379/tcp": {}
            },
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                "REDIS_VERSION=3.0.3",
                "REDIS_DOWNLOAD_URL=http://download.redis.io/releases/redis-3.0.3.tar.gz",
                "REDIS_DOWNLOAD_SHA1=0e2d7707327986ae652df717059354b358b83358"
            ],
            "Cmd": [
                "/bin/sh",
                "-c",
                "/run.sh"
            ],
            "Image": "38ab071f612493647a8bdaf82c918538558d9ec3103163cbd11f0f6565f8f4a1",
            "Volumes": {
                "/data": {}
            },
            "WorkingDir": "/data",
            "Entrypoint": [
                "/entrypoint.sh"
            ],
            "OnBuild": [],
            "Labels": null
        },
        "Architecture": "amd64",
        "Os": "linux",
        "Size": 109507975,
        "VirtualSize": 109507975,
        "GraphDriver": {
            "Name": "overlay2",
            "Data": {
                "LowerDir": "/var/lib/docker/overlay2/a6ccabc8f3922076b9b8a9c80c55510c1c8f49970f3176ff59ce99bf830c21e5/diff:/var/lib/docker/overlay2/9d488b8afab3c4b95fb672817c2b0ab447bcc784ec92b47b5ffdc8c42139b994/diff:/var/lib/docker/overlay2/44bbfe74947be30130f74a4ab89c9e8672743edce956731ec0aec130df347321/diff:/var/lib/docker/overlay2/a5727b7d50da9b3d673a2a676a2e09ae0b35d5bcbecd8c9a3c19753ee02bb349/diff:/var/lib/docker/overlay2/d26d7734e6117e329e651b55b206403552526594b40570055f5af67d65f40b1f/diff:/var/lib/docker/overlay2/71c80c21a6781a8874ceb8ddcc2041c1577de0401596630b04e25688ed478a3b/diff:/var/lib/docker/overlay2/625e384103bfc019052fc7e47ca7f62161f6107cb65549ed76e9a7204209be9a/diff:/var/lib/docker/overlay2/8d2e7193ec8ac685c3e1313aea036cc1c00ae9184fe2e54eb607532c636f36e4/diff:/var/lib/docker/overlay2/ce51af36741fa97e5df4c1b825ac295d643e946eec1c9521c617c294623d655f/diff:/var/lib/docker/overlay2/7518fd02ee60d39e16d337c837347a23982c6823d9edcd1cab4442776b0e9171/diff:/var/lib/docker/overlay2/05f77b6322941f4b1219328ea9bc53e169793581cbe0a36602ce942a0b304a72/diff:/var/lib/docker/overlay2/e0dbb075b4ae6843d75b267e0dea4d2f6cae1479716b20a482460e63d30574f9/diff:/var/lib/docker/overlay2/7ab9d84b7e90d74fb9be409b7d6fdfde838f2194ecde10ab5e30f3ffa0c6d709/diff:/var/lib/docker/overlay2/a822c1d26254b601f8bbcc76614c5f780eb70d1e77dd9e2af7e9c27c553a0f24/diff:/var/lib/docker/overlay2/c33410a51a942269057d44e99b9de533be1ec61c94f2efe681b4ecc5c049169c/diff:/var/lib/docker/overlay2/88bcd8073d56cfdb5431a0b6216e071072d950e4398eba4ce0d0a660a7f46e08/diff:/var/lib/docker/overlay2/dec060e6221772e70e058fb427cfcb52b2fa9b9d7b568f7e966dd7afa02f0c14/diff:/var/lib/docker/overlay2/c01a0bc5ea4e7360b9507a738a6a177470472afdccf1238805e8842ff494ea48/diff:/var/lib/docker/overlay2/4421e84bbedc7e4c8ffc4acf01788da1ec2232040ee5c4320379837fda269991/diff",
                "MergedDir": "/var/lib/docker/overlay2/f55fb8b13d498515042d7f0cc0a3949c3a1b9335c0ae37963068e46d66ae8f3e/merged",
                "UpperDir": "/var/lib/docker/overlay2/f55fb8b13d498515042d7f0cc0a3949c3a1b9335c0ae37963068e46d66ae8f3e/diff",
                "WorkDir": "/var/lib/docker/overlay2/f55fb8b13d498515042d7f0cc0a3949c3a1b9335c0ae37963068e46d66ae8f3e/work"
            }
        },
        "RootFS": {
            "Type": "layers",
            "Layers": [
                "sha256:845fd9c828fa7c0c46b78a783b10620b5672c3150ebf7305118abbe73561fdc1",
                "sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef",
                "sha256:e5ba2eafe4be3cce6984c73b3d89756ce284599f2c8f3116cf72aa6109443bbf",
                "sha256:64d85d9bf6f2b60bd9fb57df301f64431cc5f2f5ea51f3963b9ee9499684b549",
                "sha256:30a01e9ae3cafdf036fae59440fbe2d1e3d4bbbbcfbbfabb699eee9455e7b3ad",
                "sha256:d3d6949b587abd4267aecaa3d3dfb06363c9c9eda4ac52892f36d80d0e8e476c",
                "sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef",
                "sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef",
                "sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef",
                "sha256:bd711f7ba37724492cda97725732a7138f1cfb96f08dc508b95f432da12ccfd0",
                "sha256:a6a56651a9230941f7ee8f8dac701b46480e253f94146565b46082682d56f1cd",
                "sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef",
                "sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef",
                "sha256:7986f971c50fb4973c1dc11811e308e7f86954596de9ea801bec80e6d23a1429",
                "sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef",
                "sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef",
                "sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef",
                "sha256:1d697caea41f8dcc1d181e12e1ed36d682d1a68995b9ec4eeb16bb13d0ee126b",
                "sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef",
                "sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef"
            ]
        }
    }
]
[root@k8s_master ~]#

这个详情信息中能看到有这么一个cmd行为

        "Cmd": [
            "/bin/sh",
            "-c",
            "#(nop) CMD [/bin/sh -c /run.sh]"
        ]

就是作主从同步的

----

创建 redis slave 的Service

[root@k8s_master ~]# cat redis-slave-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: redis-slave
  labels:
    name: redis-slave-lab
spec:
  ports:
  - port: 6379
    targetPort: 6379
  selector:
    name: redis-slave-lab # pod的标签

[root@k8s_master ~]# kubectl create -f redis-slave-service.yaml 
service "redis-slave" created
[root@k8s_master ~]# kubectl get service
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes 10.254.0.1 <none> 443/TCP 5d
redis-master 10.254.93.254 <none> 6379/TCP 1d
redis-slave 10.254.25.255 <none> 6379/TCP 6s
web 10.254.114.97 <none> 8080/TCP 3d
[root@k8s_master ~]# 
[root@k8s_node1 ~]# curl 10.254.25.255:6379
-ERR wrong number of arguments for 'get' command
-ERR unknown command 'User-Agent:'
-ERR unknown command 'Host:'
-ERR unknown command 'Accept:'

查看这个service的后端信息

[root@k8s_master ~]# kubectl describe service redis-slave
Name:	redis-slave
Namespace:	default
Labels:	name=redis-slave-lab
Selector:	name=redis-slave-lab
Type:	ClusterIP
IP:	10.254.25.255
Port:	<unset>	6379/TCP
Endpoints:	172.17.13.4:6379,172.17.24.3:6379
Session Affinity:	None
No events.
[root@k8s_master ~]# 

创建PHP应用的 rc

[root@k8s_master ~]# cat php-rc.yaml 
apiVersion: v1
kind: ReplicationController
metadata:
  name: php-rc
  labels:
    name: php-rc-lab
spec:
  replicas: 2
  selector:
    name: php-rc-splab
  template:
    metadata:
      name: php-rc-tem
      labels:
        name: php-rc-splab
    spec:
      containers:
      - name: php-rc-con
        image: 172.16.111.200:5000/guestbook-php-frontend
        env:
        - name: GET_HOSTS_FROM
          value: env
        ports:
        - containerPort: 80
    
[root@k8s_master ~]# kubectl create -f php-rc.yaml 
replicationcontroller "php-rc" created
[root@k8s_master ~]# 
[root@k8s_master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
php-rc-kvqt0 1/1 Running 0 1m
php-rc-ss5v0 1/1 Running 0 1m
redis-master-gnxk0 1/1 Running 0 1d
redis-slave-3x3m0 1/1 Running 0 1d
redis-slave-9btjh 1/1 Running 0 1d
[root@k8s_master ~]# 

创建php 的 service

这次创建的service跟前面的不同,之前创建的都只是容器间内部访问,这个PHP应用的要让外部能访问到

[root@k8s_master ~]# cat php-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: php
  labels:
    name: php-lab
spec:
  type: NodePort
  ports:
  - port: 80
    nodePort: 30001
  selector:
    name: php-rc-splab # pod的标签

[root@k8s_master ~]# kubectl create -f php-service.yaml 
service "php" created
[root@k8s_master ~]# kubectl get service
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes 10.254.0.1 <none> 443/TCP 5d
php 10.254.73.44 <nodes> 80:30001/TCP 24s
redis-master 10.254.93.254 <none> 6379/TCP 1d
redis-slave 10.254.25.255 <none> 6379/TCP 32m
web 10.254.114.97 <none> 8080/TCP 3d
[root@k8s_master ~]# 

去node节点上查看30001端口是否有服务映射

[root@k8s_node1 ~]# netstat -tlnup | grep 30001
tcp6 0 0 :::30001 :::* LISTEN 20524/kube-proxy    
[root@k8s_node1 ~]# 

去浏览器访问测试一下

表单提交

但是没有成功写入

排查发现,在上面的页面显示中
{{msg}} 这内容表明是前端有未渲染成功的数据

从浏览器控制台早发现有几个资料未加载到,看了加载来源是google的cdn,但由于天朝众所周知的原因,不能加载到

--

设置梯子,并把我们的内网ip要放到排除列表

用梯子后


实验完整成功!


查看这个PHP应用的日志

[root@k8s_master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
php-rc-kvqt0 1/1 Running 0 28m
php-rc-ss5v0 1/1 Running 0 28m
redis-master-gnxk0 1/1 Running 0 1d
redis-slave-3x3m0 1/1 Running 0 1d
redis-slave-9btjh 1/1 Running 0 1d
[root@k8s_master ~]# 
[root@k8s_master ~]# kubectl logs php-rc-ss5v0
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.24.2. Set the 'ServerName' directive globally to suppress this message
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.24.2. Set the 'ServerName' directive globally to suppress this message
[Wed Dec 12 14:54:25.513672 2018] [mpm_prefork:notice] [pid 1] AH00163: Apache/2.4.10 (Debian) PHP/5.6.12 configured -- resuming normal operations
[Wed Dec 12 14:54:25.513710 2018] [core:notice] [pid 1] AH00094: Command line: 'apache2 -D FOREGROUND'
172.17.24.1 - - [12/Dec/2018:15:06:48 +0000] "GET / HTTP/1.1" 200 826 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:61.0) Gecko/20100101 Firefox/61.0"
172.17.24.1 - - [12/Dec/2018:15:06:48 +0000] "GET /controllers.js HTTP/1.1" 200 759 "http://172.16.111.201:30001/" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:61.0) Gecko/20100101 Firefox/61.0"
172.17.24.1 - - [12/Dec/2018:15:08:51 +0000] "GET / HTTP/1.1" 200 826 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:61.0) Gecko/20100101 Firefox/61.0"
172.17.24.1 - - [12/Dec/2018:15:08:51 +0000] "GET /controllers.js HTTP/1.1" 200 759 "http://172.16.111.201:30001/" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:61.0) Gecko/20100101 Firefox/61.0"
172.17.24.1 - - [12/Dec/2018:15:09:55 +0000] "GET / HTTP/1.1" 200 826 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:61.0) Gecko/20100101 Firefox/61.0"
172.17.24.1 - - [12/Dec/2018:15:09:55 +0000] "GET /controllers.js HTTP/1.1" 200 759 "http://172.16.111.201:30001/" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:61.0) Gecko/20100101 Firefox/61.0"
172.17.13.0 - - [12/Dec/2018:15:11:11 +0000] "GET /favicon.ico HTTP/1.1" 404 437 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:61.0) Gecko/20100101 Firefox/61.0"
172.17.13.0 - - [12/Dec/2018:15:13:51 +0000] "GET / HTTP/1.1" 200 826 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:61.0) Gecko/20100101 Firefox/61.0"
172.17.13.0 - - [12/Dec/2018:15:13:51 +0000] "GET /controllers.js HTTP/1.1" 200 759 "http://172.16.111.202:30001/" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:61.0) Gecko/20100101 Firefox/61.0"
172.17.24.1 - - [12/Dec/2018:15:25:59 +0000] "GET / HTTP/1.1" 200 826 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36"
172.17.24.1 - - [12/Dec/2018:15:25:59 +0000] "GET /controllers.js HTTP/1.1" 200 759 "http://172.16.111.201:30001/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36"
172.17.24.1 - - [12/Dec/2018:15:26:30 +0000] "GET /favicon.ico HTTP/1.1" 404 437 "http://172.16.111.201:30001/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36"
172.17.24.1 - - [12/Dec/2018:15:29:14 +0000] "GET / HTTP/1.1" 200 826 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36"
172.17.24.1 - - [12/Dec/2018:15:29:14 +0000] "GET /controllers.js HTTP/1.1" 200 759 "http://172.16.111.201:30001/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36"
172.17.24.1 - - [12/Dec/2018:15:29:16 +0000] "GET /guestbook.php?cmd=get&key=messages HTTP/1.1" 200 256 "http://172.16.111.201:30001/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36"
172.17.24.1 - - [12/Dec/2018:15:29:16 +0000] "GET /favicon.ico HTTP/1.1" 404 436 "http://172.16.111.201:30001/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36"
172.17.24.1 - - [12/Dec/2018:15:30:15 +0000] "GET /guestbook.php?cmd=set&key=messages&value=Hello%20World!,itcp HTTP/1.1" 200 255 "http://172.16.111.201:30001/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36"

可以看到它刚才的被访问记录