Part 1 照本宣科暗礁多,爬完坑来乐呵呵

能动手就绝不BB,开始。

# 近日开始学习kubernetes和docker相关知识,一切从一本书开始,从第一个示例开始。但是事情远没有想象那么简单。本书在第一个示例演示上,就有若干内容错误,这些错误或许会让部分读者知难而退,但是也会让部分读者更加体会到kubernets的基础架构。

# 这个例子主要是要在k8s中利用docker部署mysql与tomcat集群,并且实现tomcat正常读写mysql的操作。

# 操作系统版本与环境
[root@k8s01 ~]# uname -ra
Linux k8s01 3.10.0-862.el7.x86_64 #1 SMP Fri Apr 20 16:44:24 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
[root@k8s01 ~]# cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)

Oracle Vbox 版本: 5.1.3 on MAC Book Pro, High Sierra 10.13.6

#刷新yum资源库
[root@k8s01 ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   38G  1.1G   37G   3% /
devtmpfs                 233M     0  233M   0% /dev
tmpfs                    244M     0  244M   0% /dev/shm
tmpfs                    244M  4.5M  240M   2% /run
tmpfs                    244M     0  244M   0% /sys/fs/cgroup
/dev/sda1               1014M  129M  885M  13% /boot
tmpfs                     49M     0   49M   0% /run/user/0
/dev/sr0                 4.2G  4.2G     0 100% /media/cdrom
[root@k8s01 ~]# yum clean all
Loaded plugins: fastestmirror
Repodata is over 2 weeks old. Install yum-cron? Or run: yum makecache fast
Cleaning repos: base c7-media extras updates
Cleaning up everything
Maybe you want: rm -rf /var/cache/yum, to also free up space taken by orphaned data from disabled or removed repos
Cleaning up list of fastest mirrors
[root@k8s01 ~]# yum repolist
Loaded plugins: fastestmirror
Determining fastest mirrors
 * base: mirrors.aliyun.com
 * extras: mirrors.nju.edu.cn
 * updates: mirrors.huaweicloud.com
base                                                                                                                                                                                            | 3.6 kB  00:00:00
c7-media                                                                                                                                                                                        | 3.6 kB  00:00:00
extras                                                                                                                                                                                          | 3.4 kB  00:00:00
updates                                                                                                                                                                                         | 3.4 kB  00:00:00
(1/6): c7-media/group_gz                                                                                                                                                                        | 166 kB  00:00:00
(2/6): c7-media/primary_db                                                                                                                                                                      | 3.1 MB  00:00:00
(3/6): base/7/x86_64/group_gz                                                                                                                                                                   | 166 kB  00:00:00
(4/6): extras/7/x86_64/primary_db                                                                                                                                                               | 187 kB  00:00:01
(5/6): updates/7/x86_64/primary_db                                                                                                                                                              | 5.2 MB  00:00:03
(6/6): base/7/x86_64/primary_db                                                                                                                                                                 | 5.9 MB  00:00:08
repo id                                                                                                repo name                                                                                                 status
base/7/x86_64                                                                                          CentOS-7 - Base                                                                                           9,911
c7-media                                                                                               CentOS-7 - Media                                                                                          3,971
extras/7/x86_64                                                                                        CentOS-7 - Extras                                                                                           403
updates/7/x86_64                                                                                       CentOS-7 - Updates                                                                                        1,348
repolist: 15,633

#使用yum安装etcd,kubernernets,期间会自动安装匹配的docker版本
[root@k8s01 ~]# yum install -y etcd kubernetes 

[root@k8s01 ~]# 
systemctl start etcd
systemctl start docker
systemctl start kube-apiserver
systemctl start kube-controller-manager
systemctl start kube-scheduler
systemctl start kubelet
systemctl start kube-proxy


systemctl stop etcd
systemctl stop docker
systemctl stop kube-apiserver
systemctl stop kube-controller-manager
systemctl stop kube-scheduler
systemctl stop kubelet
systemctl stop kube-proxy


#按照书上的例子创建rc
[root@k8s01 ~]# vi mysql-rc.yaml
apiVersion: v1
kind: ReplicationController     #制定类型为 RC
metadata:
  name: mysql             #RC 名称,全局唯一
spec:
  replicas: 1             #pod 副本数量为1
  selector:
    app: mysql            #按照标签为mysql进行筛选
  template:               #当副本数量不足时,按此模版创建新副本
    metadata:
      labels:
        app: mysql        #被创建的副本缩拥有的标签,与selector下的标签对应,方能在创建后被选中
    spec:
      containers:         #以下是pod内容器内定义
      - name: mysql       #定义容器名称
        image: mysql      #指定容器使用的image名称,注意书写规范,有tag需要带上
        ports:
        - containerPort: 3306     #容器应用监听的端口号
        env:
        - name: MYSQL_ROOT_PASSWORD   #注入容器的环境变量
          value: "123456"


[root@k8s01 ~]# kubectl create -f mysql-rc.yaml

[root@k8s01 ~]# kubectl get rc
NAME      DESIRED   CURRENT   READY     AGE
mysql     1         0         0         23h
[root@k8s01 ~]#

[root@k8s01 ~]# kubectl get pod -o wide --all-namespaces
No resources found.

[root@k8s01 ~]# vi /etc/kubernetes/apiserver
 delete "ServiceAccount"
 service kube-apiserver restart 


[root@k8s01 ~]# service kube-apiserver restart

[root@k8s01 ~]# kubectl get pod -o wide --all-namespaces
NAMESPACE   NAME          READY     STATUS              RESTARTS   AGE       IP        NODE
default     mysql-pfz6q   0/1       ContainerCreating   0          5s        <none>    127.0.0.1


[root@k8s01 ~]# kubectl describe pod mysql-pfz6q
Name:           mysql-pfz6q
Namespace:      default
Node:           127.0.0.1/127.0.0.1
Start Time:     Mon, 24 Sep 2018 10:26:12 +0800
Labels:         app=mysql
Status:         Pending
IP:
Controllers:    ReplicationController/mysql
Containers:
  mysql:
    Container ID:
    Image:              mysql
    Image ID:
    Port:               3306/TCP
    State:              Waiting
      Reason:           ContainerCreating
    Ready:              False
    Restart Count:      0
    Volume Mounts:      <none>
    Environment Variables:
      MYSQL_ROOT_PASSWORD:      123456
Conditions:
  Type          Status
  Initialized   True
  Ready         False
  PodScheduled  True
No volumes.
QoS Class:      BestEffort
Tolerations:    <none>
Events:
  FirstSeen     LastSeen        Count   From                    SubObjectPath   Type            Reason          Message
  ---------     --------        -----   ----                    -------------   --------        ------          -------
  47s           47s             1       {default-scheduler }                    Normal          Scheduled       Successfully assigned mysql-pfz6q to 127.0.0.1
  21s           21s             1       {kubelet 127.0.0.1}                     Warning         FailedSync      Error syncing pod, skipping: failed to "StartContainer" for "POD" with ImagePullBackOff: "Back-off pulling image \"registry.access.redhat.com/rhel7/pod-infrastructure:latest\""

  47s   10s     3       {kubelet 127.0.0.1}             Warning FailedSync      Error syncing pod, skipping: failed to "StartContainer" for "POD" with ErrImagePull: "image pull failed for registry.access.redhat.com/rhel7/pod-infrastructure:latest, this may be because there are no credentials on this request.  details: (open /etc/docker/certs.d/registry.access.redhat.com/redhat-ca.crt: no such file or directory)"


# 坑1 通过 kubectl describe pod xxx 观察具体报错原因,发现基础image pull失败,是由于rhsm证书不存在导致。
# 手动 pull 一次试试,证实了以上的错误原因。注意这个镜像是kubernetes最基础的image,每个container启动,都依赖一个该image
[root@k8s01 ~]# docker pull registry.access.redhat.com/rhel7/pod-infrastructure
Using default tag: latest
Trying to pull repository registry.access.redhat.com/rhel7/pod-infrastructure ...
open /etc/docker/certs.d/registry.access.redhat.com/redhat-ca.crt: no such file or directory


# 查看证书文件,确实不存在
[root@k8s01 ~]# ls -lrt /etc/docker/certs.d/registry.access.redhat.com/redhat-ca.crt
lrwxrwxrwx. 1 root root 27 Sep 24 10:20 /etc/docker/certs.d/registry.access.redhat.com/redhat-ca.crt -> /etc/rhsm/ca/redhat-uep.pem
[root@k8s01 ~]# ls -lrt /etc/rhsm/ca/
total 0


# 但只要安装了 python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm 就可以得到该证书文件;相反一旦被卸载,该文件也同时被删除
# 矛盾在与这个包在yum的依赖列表中已经被替代了,因此没有被安装。然而手动安装却会白告知冲突。
[root@k8s01 ~]# rpm -Uvh /media/cdrom/Packages/python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm
error: Failed dependencies:
        python-rhsm-certificates <= 1.20.3-1 is obsoleted by (installed) subscription-manager-rhsm-certificates-1.20.11-1.el7.centos.x86_64


# 因此只能先卸载现有rhsm包,再安装旧包,以得到redhat-uep.pem证书文件。但是注意到这一下子,连带docker与kubernetes相关部分组建也会被删除!!! 
# 另外,一旦重新yum 安装kubernets,会自动清理掉以被废弃的rhsm包,也就意味着证书文件也同时被删除!(网上没有人提到这个)
[root@k8s01 ~]# rpm -qa | grep rhsm
subscription-manager-rhsm-certificates-1.20.11-1.el7.centos.x86_64

[root@k8s01 ~]# yum remove *rhsm*
Loaded plugins: fastestmirror
Resolving Dependencies
--> Running transaction check
---> Package subscription-manager-rhsm-certificates.x86_64 0:1.20.11-1.el7.centos will be erased
--> Processing Dependency: subscription-manager-rhsm-certificates for package: 2:docker-1.13.1-74.git6e3bb8e.el7.centos.x86_64
--> Running transaction check
---> Package docker.x86_64 2:1.13.1-74.git6e3bb8e.el7.centos will be erased
--> Processing Dependency: docker for package: kubernetes-node-1.5.2-0.7.git269f928.el7.x86_64
--> Running transaction check
---> Package kubernetes-node.x86_64 0:1.5.2-0.7.git269f928.el7 will be erased
--> Processing Dependency: kubernetes-node = 1.5.2-0.7.git269f928.el7 for package: kubernetes-1.5.2-0.7.git269f928.el7.x86_64
--> Running transaction check
---> Package kubernetes.x86_64 0:1.5.2-0.7.git269f928.el7 will be erased
--> Finished Dependency Resolution

Dependencies Resolved

=======================================================================================================================================================================================================================
 Package                                                              Arch                                 Version                                                         Repository                             Size
=======================================================================================================================================================================================================================
Removing:
 subscription-manager-rhsm-certificates                               x86_64                               1.20.11-1.el7.centos                                            @base                                 0.0
Removing for dependencies:
 docker                                                               x86_64                               2:1.13.1-74.git6e3bb8e.el7.centos                               @extras                                57 M
 kubernetes                                                           x86_64                               1.5.2-0.7.git269f928.el7                                        @extras                               0.0
 kubernetes-node                                                      x86_64                               1.5.2-0.7.git269f928.el7                                        @extras                                78 M

Transaction Summary
=======================================================================================================================================================================================================================
Remove  1 Package (+3 Dependent packages)

Installed size: 135 M
Is this ok [y/N]: y
Downloading packages:
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Erasing    : kubernetes-1.5.2-0.7.git269f928.el7.x86_64                                                                                                                                                          1/4
  Erasing    : kubernetes-node-1.5.2-0.7.git269f928.el7.x86_64                                                                                                                                                     2/4
  Erasing    : 2:docker-1.13.1-74.git6e3bb8e.el7.centos.x86_64                                                                                                                                                     3/4
warning: /etc/sysconfig/docker-storage saved as /etc/sysconfig/docker-storage.rpmsave
  Erasing    : subscription-manager-rhsm-certificates-1.20.11-1.el7.centos.x86_64                                                                                                                                  4/4
  Verifying  : subscription-manager-rhsm-certificates-1.20.11-1.el7.centos.x86_64                                                                                                                                  1/4
  Verifying  : kubernetes-1.5.2-0.7.git269f928.el7.x86_64                                                                                                                                                          2/4
  Verifying  : kubernetes-node-1.5.2-0.7.git269f928.el7.x86_64                                                                                                                                                     3/4
  Verifying  : 2:docker-1.13.1-74.git6e3bb8e.el7.centos.x86_64                                                                                                                                                     4/4

Removed:
  subscription-manager-rhsm-certificates.x86_64 0:1.20.11-1.el7.centos

Dependency Removed:
  docker.x86_64 2:1.13.1-74.git6e3bb8e.el7.centos                        kubernetes.x86_64 0:1.5.2-0.7.git269f928.el7                        kubernetes-node.x86_64 0:1.5.2-0.7.git269f928.el7

Complete!


# 再次手动安装rhsm包,终于得到了 /etc/rhsm/ca/redhat-uep.pem。有了它就可以。 
# 一切都是为了这个证书,所以,备份一个,到其他位置。待kubernetes重新安装后,旧rhsm虽然被删除,但是我们可以将这个证书文件放回原位,以此跳过这个大坑!才可以顺利pull基础image。
[root@k8s01 ~]# rpm -Uvh /media/cdrom/Packages/python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm
Preparing...                          ################################# [100%]
Updating / installing...
   1:python-rhsm-certificates-1.19.10-################################# [100%]
[root@k8s01 ~]# ls -lrt /etc/rhsm/ca/redhat-uep.pem
-rw-r--r--. 1 root root 7732 Oct 20  2017 /etc/rhsm/ca/redhat-uep.pem


## [root@k8s01 ~]# ls -lrt /media/cdrom/Packages/python-rhsm-
python-rhsm-1.19.10-1.el7_4.x86_64.rpm               python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm

## save redhat-uep.pem
## reinstall all and start all
## put redhat-uep.pem into /etc/rhsm/ca/redhat-uep.pem

# 这时就可以手动pull了。当然有了以上经历,与现成的证书,完全可以在创建rc之前就将证书文件归位,这样pod可以顺利创建。
[root@k8s01 ~]# docker pull registry.access.redhat.com/rhel7/pod-infrastructure:latest
Trying to pull repository registry.access.redhat.com/rhel7/pod-infrastructure ...
latest: Pulling from registry.access.redhat.com/rhel7/pod-infrastructure
26e5ed6899db: Pull complete
66dbe984a319: Pull complete
9138e7863e08: Pull complete
Digest: sha256:92d43c37297da3ab187fc2b9e9ebfb243c1110d446c783ae1b989088495db931
Status: Downloaded newer image for registry.access.redhat.com/rhel7/pod-infrastructure:latest
[root@k8s01 ~]# docker images -a
REPOSITORY                                            TAG                 IMAGE ID            CREATED             SIZE
docker.io/mysql                                       latest              6a834f03bd02        10 days ago         484 MB
registry.access.redhat.com/rhel7/pod-infrastructure   latest              99965fb98423        11 months ago       209 MB

# 准备重建rc,因此先删除rc,并重启所有服务
[root@k8s01 ~]# kubectl delete -f mysql-rc.yaml
replicationcontroller "mysql" deleted

[root@k8s01 ~]# systemctl stop etcd
[root@k8s01 ~]# systemctl stop docker
[root@k8s01 ~]# systemctl stop kube-apiserver
[root@k8s01 ~]# systemctl stop kube-controller-manager
[root@k8s01 ~]# systemctl stop kube-scheduler
[root@k8s01 ~]# systemctl stop kubelet
[root@k8s01 ~]# systemctl stop kube-proxy
[root@k8s01 ~]# systemctl start etcd

[root@k8s01 ~]# systemctl start docker
[root@k8s01 ~]# systemctl start kube-apiserver
[root@k8s01 ~]# systemctl start kube-controller-manager
[root@k8s01 ~]# systemctl start kube-scheduler
[root@k8s01 ~]# systemctl start kubelet
[root@k8s01 ~]# systemctl start kube-proxy

# 证书文件归位后,重新创建rc,观察到不再报基础image不能pull的错误,并且已经进入pull mysql image阶段,这需要一点点时间。
[root@k8s01 ~]# kubectl create -f mysql-rc.yaml
replicationcontroller "mysql" created
[root@k8s01 ~]# kubectl get pod -o wide --all-namespaces
NAMESPACE   NAME          READY     STATUS              RESTARTS   AGE       IP        NODE
default     mysql-qjfb9   0/1       ContainerCreating   0          5s        <none>    127.0.0.1
[root@k8s01 ~]# kubectl describe pod mysql-qjfb9
Name:           mysql-qjfb9
Namespace:      default
Node:           127.0.0.1/127.0.0.1
Start Time:     Mon, 24 Sep 2018 10:58:33 +0800
Labels:         app=mysql
Status:         Pending
IP:
Controllers:    ReplicationController/mysql
Containers:
  mysql:
    Container ID:
    Image:              mysql
    Image ID:
    Port:               3306/TCP
    State:              Waiting
      Reason:           ContainerCreating
    Ready:              False
    Restart Count:      0
    Volume Mounts:      <none>
    Environment Variables:
      MYSQL_ROOT_PASSWORD:      123456
Conditions:
  Type          Status
  Initialized   True
  Ready         False
  PodScheduled  True
No volumes.
QoS Class:      BestEffort
Tolerations:    <none>
Events:
  FirstSeen     LastSeen        Count   From                    SubObjectPath   Type            Reason          Message
  ---------     --------        -----   ----                    -------------   --------        ------          -------
  23s           23s             1       {default-scheduler }                    Normal          Scheduled       Successfully assigned mysql-qjfb9 to 127.0.0.1
[root@k8s01 ~]# kubectl get pod -o wide --all-namespaces
NAMESPACE   NAME          READY     STATUS              RESTARTS   AGE       IP        NODE
default     mysql-qjfb9   0/1       ContainerCreating   0          29s       <none>    127.0.0.1
[root@k8s01 ~]# kubectl get pod -o wide --all-namespaces
NAMESPACE   NAME          READY     STATUS              RESTARTS   AGE       IP        NODE
default     mysql-qjfb9   0/1       ContainerCreating   0          1m        <none>    127.0.0.1
[root@k8s01 ~]# kubectl describe pod mysql-qjfb9
Name:           mysql-qjfb9
Namespace:      default
Node:           127.0.0.1/127.0.0.1
Start Time:     Mon, 24 Sep 2018 10:58:33 +0800
Labels:         app=mysql
Status:         Pending
IP:
Controllers:    ReplicationController/mysql
Containers:
  mysql:
    Container ID:
    Image:              mysql
    Image ID:
    Port:               3306/TCP
    State:              Waiting
      Reason:           ContainerCreating
    Ready:              False
    Restart Count:      0
    Volume Mounts:      <none>
    Environment Variables:
      MYSQL_ROOT_PASSWORD:      123456
Conditions:
  Type          Status
  Initialized   True
  Ready         False
  PodScheduled  True
No volumes.
QoS Class:      BestEffort
Tolerations:    <none>
Events:
  FirstSeen     LastSeen        Count   From                    SubObjectPath           Type            Reason                  Message
  ---------     --------        -----   ----                    -------------           --------        ------                  -------
  1m            1m              1       {default-scheduler }                            Normal          Scheduled               Successfully assigned mysql-qjfb9 to 127.0.0.1
  7s            7s              1       {kubelet 127.0.0.1}                             Warning         MissingClusterDNS       kubelet does not have ClusterDNS IP configured and cannot create Pod using "ClusterFirst" policy. Falling back to DNSDefault policy.
  5s            5s              1       {kubelet 127.0.0.1}     spec.containers{mysql}  Normal          Pulling                 pulling image "mysql"
[root@k8s01 ~]#

# 最终,在pod的event里看到 container顺利启动
Events:
  FirstSeen     LastSeen        Count   From                    SubObjectPath           Type            Reason                  Message
  ---------     --------        -----   ----                    -------------           --------        ------                  -------
  3m            3m              1       {default-scheduler }                            Normal          Scheduled               Successfully assigned mysql-qjfb9 to 127.0.0.1
  1m            1m              1       {kubelet 127.0.0.1}     spec.containers{mysql}  Normal          Pulling                 pulling image "mysql"
  1m            29s             2       {kubelet 127.0.0.1}                             Warning         MissingClusterDNS       kubelet does not have ClusterDNS IP configured and cannot create Pod using "ClusterFirst" policy. Falling back to DNSDefault policy.
  29s           29s             1       {kubelet 127.0.0.1}     spec.containers{mysql}  Normal          Pulled                  Successfully pulled image "mysql"
  27s           27s             1       {kubelet 127.0.0.1}     spec.containers{mysql}  Normal          Created                 Created container with docker id 8b4f109879c3; Security:[seccomp=unconfined]
  27s           27s             1       {kubelet 127.0.0.1}     spec.containers{mysql}  Normal          Started                 Started container with docker id 8b4f109879c3

# 看到的pod状态也是running了!
[root@k8s01 ~]# kubectl get pod -o wide --all-namespaces
NAMESPACE   NAME          READY     STATUS    RESTARTS   AGE       IP           NODE
default     mysql-qjfb9   1/1       Running   0          6m        172.17.0.2   127.0.0.1

# 可以看到docker内基础image与mysql image 两个image
[root@k8s01 ~]# docker images
REPOSITORY                                            TAG                 IMAGE ID            CREATED             SIZE
docker.io/mysql                                       latest              6a834f03bd02        2 weeks ago         484 MB
registry.access.redhat.com/rhel7/pod-infrastructure   latest              99965fb98423        11 months ago       209 MB


# 此时还没有为rc创建svc,因此在ep和services中还没有mysql的任何信息。
[root@k8s01 ~]# kubectl get ep
NAME         ENDPOINTS        AGE
kubernetes   10.0.2.15:6443   43m
[root@k8s01 ~]# kubectl get services
NAME         CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   10.254.0.1   <none>        443/TCP   43m


# 为mysql rc创建对应的svc
[root@k8s01 ~]# cat mysql-svc.yaml
apiVersion: v1
kind: Service             #表明是 kubernetes service
metadata:
    name: mysql           #service 全局唯一名称
spec:
    type: NodePort        #指明对外开放nodePort,node外网的终端可以访问。注意端口范围为 30000-
    ports:
        - port: 3306      #service在Pod内提供的端口号
          nodePort: 30002 #对node外开放的端口号
    selector:
        app: mysql        #service对应的pod拥有这里定义的标签

[root@k8s01 ~]# kubectl create -f mysql-svc.yaml
service "mysql" created


# 可以看到 mysql的nodePort和container port的映射关系,30002是可以被外网访问的。 (注意vbox上的Port Forward设置)
[root@k8s01 ~]# kubectl get services
NAME         CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
kubernetes   10.254.0.1      <none>        443/TCP          52m
mysql        10.254.40.213   <nodes>       3306:30002/TCP   6s
[root@k8s01 ~]# kubectl get ep
NAME         ENDPOINTS         AGE
kubernetes   10.0.2.15:6443    52m
mysql        172.17.0.2:3306   15s

# 注意防火墙会阻止host的30002端口被外网访问,关掉它即可。此时,任意mysql的jdbc的客户端都可以访问到mysql container内的数据库了。
[root@k8s01 ~]# systemctl stop firewalld
[root@k8s01 ~]# systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.


# 为了演示web连接mysql,还需要部署一套tomcat,这里同样使用一个docker上的示例image,kubeguide/tomcat-app:v1, 各参数作用不再赘述。
# 按照书上的例子创建rc
[root@k8s01 ~]# vi myweb-rc.yaml
apiVersion: v1
kind: ReplicationController
metadata:
  name: myweb
spec:
  replicas: 2       #注意这里副本数量设置为2个
  selector:
    app: myweb
  template:
    metadata:
      labels:
        app: myweb
    spec:
      containers:
      - name: myweb
        image: kubeguide/tomcat-app:v1
        ports:
        - containerPort: 8080
        env:
        - name: MYSQL_SERVICE_PORT
          value: '3306'


# 创建myweb rc后,一段时间内可以看到在自动pull image kubeguide/tomcat-app:v1,需要一点点时间。
[root@k8s01 ~]# kubectl create -f myweb-rc.yaml
replicationcontroller "myweb" created
[root@k8s01 ~]# kubectl get pod myweb
Error from server (NotFound): pods "myweb" not found
[root@k8s01 ~]# kubectl get pod
NAME          READY     STATUS              RESTARTS   AGE
mysql-qjfb9   1/1       Running             0          42m
myweb-j1tnr   0/1       ContainerCreating   0          21s
myweb-x47zl   0/1       ContainerCreating   0          21s
[root@k8s01 ~]# kubectl get rc
NAME      DESIRED   CURRENT   READY     AGE
mysql     1         1         1         42m
myweb     2         2         0         52s
[root@k8s01 ~]# kubectl describe pod myweb
Name:           myweb-j1tnr
Namespace:      default
Node:           127.0.0.1/127.0.0.1
Start Time:     Mon, 24 Sep 2018 11:40:41 +0800
Labels:         app=myweb
Status:         Pending
IP:
Controllers:    ReplicationController/myweb
Containers:
  myweb:
    Container ID:
    Image:              kubeguide/tomcat-app:v1
    Image ID:
    Port:               8080/TCP
    State:              Waiting
      Reason:           ContainerCreating
    Ready:              False
    Restart Count:      0
    Volume Mounts:      <none>
    Environment Variables:
      MYSQL_SERVICE_PORT:       3306
Conditions:
  Type          Status
  Initialized   True
  Ready         False
  PodScheduled  True
No volumes.
QoS Class:      BestEffort
Tolerations:    <none>
Events:
  FirstSeen     LastSeen        Count   From                    SubObjectPath           Type            Reason                  Message
  ---------     --------        -----   ----                    -------------           --------        ------                  -------
  1m            1m              1       {default-scheduler }                            Normal          Scheduled               Successfully assigned myweb-j1tnr to 127.0.0.1
  1m            1m              1       {kubelet 127.0.0.1}                             Warning         MissingClusterDNS       kubelet does not have ClusterDNS IP configured and cannot create Pod using "ClusterFirst" policy. Falling back to DNSDefault policy.
  1m            1m              1       {kubelet 127.0.0.1}     spec.containers{myweb}  Normal          Pulling                 pulling image "kubeguide/tomcat-app:v1"

Name:           myweb-x47zl
Namespace:      default
Node:           127.0.0.1/127.0.0.1
Start Time:     Mon, 24 Sep 2018 11:40:40 +0800
Labels:         app=myweb
Status:         Pending
IP:
Controllers:    ReplicationController/myweb
Containers:
  myweb:
    Container ID:
    Image:              kubeguide/tomcat-app:v1
    Image ID:
    Port:               8080/TCP
    State:              Waiting
      Reason:           ContainerCreating
    Ready:              False
    Restart Count:      0
    Volume Mounts:      <none>
    Environment Variables:
      MYSQL_SERVICE_PORT:       3306
Conditions:
  Type          Status
  Initialized   True
  Ready         False
  PodScheduled  True
No volumes.
QoS Class:      BestEffort
Tolerations:    <none>
Events:
  FirstSeen     LastSeen        Count   From                    SubObjectPath           Type            Reason                  Message
  ---------     --------        -----   ----                    -------------           --------        ------                  -------
  1m            1m              1       {default-scheduler }                            Normal          Scheduled               Successfully assigned myweb-x47zl to 127.0.0.1
  1m            1m              1       {kubelet 127.0.0.1}                             Warning         MissingClusterDNS       kubelet does not have ClusterDNS IP configured and cannot create Pod using "ClusterFirst" policy. Falling back to DNSDefault policy.
  1m            1m              1       {kubelet 127.0.0.1}     spec.containers{myweb}  Normal          Pulling                 pulling image "kubeguide/tomcat-app:v1"


# 过一会儿从events看到 kubeguide/tomcat-app:v1  image pull完毕并且 container 顺利启动
Events:
  FirstSeen     LastSeen        Count   From                    SubObjectPath           Type            Reason                  Message
  ---------     --------        -----   ----                    -------------           --------        ------                  -------
  5m            5m              1       {default-scheduler }                            Normal          Scheduled               Successfully assigned myweb-x47zl to 127.0.0.1
  5m            5m              1       {kubelet 127.0.0.1}     spec.containers{myweb}  Normal          Pulling                 pulling image "kubeguide/tomcat-app:v1"
  5m            2m              2       {kubelet 127.0.0.1}                             Warning         MissingClusterDNS       kubelet does not have ClusterDNS IP configured and cannot create Pod using "ClusterFirst" policy. Falling back to DNSDefault policy.
  2m            2m              1       {kubelet 127.0.0.1}     spec.containers{myweb}  Normal          Pulled                  Successfully pulled image "kubeguide/tomcat-app:v1"
  2m            2m              1       {kubelet 127.0.0.1}     spec.containers{myweb}  Normal          Created                 Created container with docker id 4ceda9cf2201; Security:[seccomp=unconfined]
  2m            2m              1       {kubelet 127.0.0.1}     spec.containers{myweb}  Normal          Started                 Started container with docker id 4ceda9cf2201

# 可以看到myweb rc抽取的image
[root@k8s01 ~]# docker images
REPOSITORY                                            TAG                 IMAGE ID            CREATED             SIZE
docker.io/mysql                                       latest              6a834f03bd02        2 weeks ago         484 MB
registry.access.redhat.com/rhel7/pod-infrastructure   latest              99965fb98423        11 months ago       209 MB
docker.io/kubeguide/tomcat-app                        v1                  a29e200a18e9        2 years ago         358 MB

# 可以看到目前mysql与tomcat的container均在运行中
[root@k8s01 ~]# docker ps
CONTAINER ID        IMAGE                                                        COMMAND                  CREATED             STATUS              PORTS               NAMES
4ceda9cf2201        kubeguide/tomcat-app:v1                                      "catalina.sh run"        5 minutes ago       Up 5 minutes                            k8s_myweb.39362350_myweb-x47zl_default_9badb46a-bfab-11e8-8eb0-080027104eb1_6d54a9b7
7e7d59a979e1        kubeguide/tomcat-app:v1                                      "catalina.sh run"        5 minutes ago       Up 5 minutes                            k8s_myweb.39362350_myweb-j1tnr_default_9baea256-bfab-11e8-8eb0-080027104eb1_acd10545
1b2eee020c79        registry.access.redhat.com/rhel7/pod-infrastructure:latest   "/usr/bin/pod"           8 minutes ago       Up 8 minutes                            k8s_POD.24f70ba9_myweb-j1tnr_default_9baea256-bfab-11e8-8eb0-080027104eb1_a55863f0
d3df3493caa8        registry.access.redhat.com/rhel7/pod-infrastructure:latest   "/usr/bin/pod"           8 minutes ago       Up 8 minutes                            k8s_POD.24f70ba9_myweb-x47zl_default_9badb46a-bfab-11e8-8eb0-080027104eb1_fc05c692
8b4f109879c3        mysql                                                        "docker-entrypoint..."   48 minutes ago      Up 48 minutes                           k8s_mysql.f6601b53_mysql-qjfb9_default_b98e0e93-bfa5-11e8-8eb0-080027104eb1_1e500e77
b21ecfd57466        registry.access.redhat.com/rhel7/pod-infrastructure:latest   "/usr/bin/pod"           49 minutes ago      Up 49 minutes                           k8s_POD.1d520ba5_mysql-qjfb9_default_b98e0e93-bfa5-11e8-8eb0-080027104eb1_c70efb71


# 再为myweb rc创建对应的svc,参数含义不再赘述
[root@k8s01 ~]# vi myweb-svc.yaml
apiVersion: v1
kind: Service
metadata:
    name: myweb
spec:
    type: NodePort
    ports:
        - port: 8080
          nodePort: 30001
    selector:
        app: myweb


[root@k8s01 ~]# kubectl create -f myweb-svc.yaml
service "myweb" created


# 可以看到myweb的service的nodePort 30001已经开启 (注意vbox上的Port Forward设置)
[root@k8s01 ~]# kubectl get services
NAME         CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
kubernetes   10.254.0.1      <none>        443/TCP          1h
mysql        10.254.40.213   <nodes>       3306:30002/TCP   44m
myweb        10.254.93.139   <nodes>       8080:30001/TCP   28s

# 注意到这里myweb有两个container,均使用的8080端口 (前面host的防火墙已经关闭,这里不赘述)
[root@k8s01 ~]# kubectl get ep
NAME         ENDPOINTS                         AGE
kubernetes   10.0.2.15:6443                    1h
mysql        172.17.0.2:3306                   44m
myweb        172.17.0.3:8080,172.17.0.4:8080   34s


#在本机使用一下url就可以打开tomcat主页了。
http://127.0.0.1:30001/

#当前端口路由是这样子的:
mysql    container port 3306 ---> service nodePort 30002 ---> vbox本地端口 30002 
tomcat   container port 8080 ---> service nodePort 30001 ---> vbox本地端口 30001 

# 坑2. 但是用于演示tomcat连接mysql的示例却无法打开,是怎么回事呢? 
http://127.0.0.1:30001/demo
页面报错: Error:com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server.

分析:首先确认几个问题
1)mysql container启动正常,并且通过30002端口可以访问该数据库证明,说明整个容器是运行正常的。
2)myweb container启动正常,并且通过30001端口可以访问tomcat主页,说明整个容器也是运行正常的。
3)从报错看,是tomcat项目在尝试连接mysql数据库时,没有找到其所在主机。因此需要看看 kubeguide/tomcat-app:v1 中是如何定义数据库连接的。


# 手动run一个 kubeguide/tomcat-app:v1 ,并进入container 观察项目代码中的 index.jsp文件
[root@k8s01 ~]# docker run -it docker.io/kubeguide/tomcat-app:v1 /bin/bash
root@cc6c9fec806e:/usr/local/tomcat# ls -lrt webapps/demo/
total 12
-rw-r--r--. 1 root root  650 Jun 12  2016 input.html
-rw-r--r--. 1 root root 3471 Jun 12  2016 index.jsp
-rw-r--r--. 1 root root 2006 Jun 12  2016 insert.jsp
drwxr-xr-x. 3 root root   32 Jun 28  2016 WEB-INF

root@cc6c9fec806e:/usr/local/tomcat# cat webapps/demo/index.jsp
................
try{
      Class.forName("com.mysql.jdbc.Driver");
       String ip=System.getenv("MYSQL_SERVICE_HOST");
       String port=System.getenv("MYSQL_SERVICE_PORT");
       ip=(ip==null)?"localhost":ip;
       port=(port==null)?"3306":port;
      System.out.println("Connecting to database...");

      conn = java.sql.DriverManager.getConnection("jdbc:mysql://"+ip+":"+port+"?useUnicode=true&characterEncoding=UTF-8", "root","123456");

      stmt = conn.createStatement();
      String sql = "show databases like 'HPE_APP'";
      rs =stmt.executeQuery(sql);
...............
#以上发现,该项目使用了env注入的方式获取mysql的主机地址与端口。默认值分别为localhost与3306. 这就难怪了,因为在myweb-rc.yaml仅定义了MYSQL_SERVICE_PORT,而没有MYSQL_SERVICE_HOST。
#因此去myweb-rc.yaml增加MYSQL_SERVICE_HOST,先找到mysql的ep是172.17.0.2
[root@k8s01 ~]# kubectl get ep
NAME         ENDPOINTS                         AGE
kubernetes   10.0.2.15:6443                    2h
mysql        172.17.0.2:3306                   1h
myweb        172.17.0.3:8080,172.17.0.4:8080   40m

[root@k8s01 ~]# vi myweb-rc.yaml
apiVersion: v1
kind: ReplicationController
metadata:
  name: myweb
spec:
  replicas: 2
  selector:
    app: myweb
  template:
    metadata:
      labels:
        app: myweb
    spec:
      containers:
      - name: myweb
        image: kubeguide/tomcat-app:v1
        # image: 241374050/tomcat:v2
        ports:
        - containerPort: 8080
        env:
        - name: MYSQL_SERVICE_HOST
          value: 172.17.0.2
        - name: MYSQL_SERVICE_PORT
          value: '3306'

# 重建myweb rc
[root@k8s01 ~]# kubectl delete -f myweb-rc.yaml
replicationcontroller "myweb" deleted
[root@k8s01 ~]# kubectl create -f myweb-rc.yaml
replicationcontroller "myweb" created


#问题仍然存在,此时尝试更换与mysql匹配的jdbc版本 mysql-connector-java-8.0.11.jar
#顺便发现了demo项目使用的mysql jdbc版本是5.1.37
root@cc6c9fec806e:/usr/local/tomcat# ls -lrt webapps/demo/WEB-INF/lib/mysql-connector-java-5.1.37.jar 
-rw-r--r--. 1 root root 985600 Jun 12  2016 webapps/demo/WEB-INF/lib/mysql-connector-java-5.1.37.jar

#注意,这里将会把mysql-connector-java-8.0.11.jar替换进tomcat的image,但container一旦exit就会丢失所有变更,所以唯一的方法是 手动run container,并替换jdbc后,提交image做保存。

[root@k8s01 ~]# docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username (241374050): 241374050
Password:
Login Succeeded
[root@k8s01 ~]# docker images
REPOSITORY                                            TAG                 IMAGE ID            CREATED             SIZE
docker.io/mysql                                       latest              6a834f03bd02        2 weeks ago         484 MB
registry.access.redhat.com/rhel7/pod-infrastructure   latest              99965fb98423        11 months ago       209 MB
docker.io/kubeguide/tomcat-app                        v1                  a29e200a18e9        2 years ago         358 MB
[root@k8s01 ~]# docker run -it kubeguide/tomcat-app:v1 /bin/bash
root@00d0103f014d:/usr/local/tomcat# ls -lrt /usr/local/tomcat/webapps/demo/WEB-INF/lib/
total 964
-rw-r--r--. 1 root root 985600 Jun 12  2016 mysql-connector-java-5.1.37.jar

#注意,依次按 control+P,+Q, 即可不关闭container的情况下回到host,然后使用docker cp将jdbc 8的文件拷贝至container
[root@k8s01 ~]# ls -lrt mysql-connector-java-8.0.11.jar
-rw-r--r--. 1 root root 2036609 Sep 24 12:59 mysql-connector-java-8.0.11.jar
[root@k8s01 ~]# docker cp mysql-connector-java-8.0.11.jar 00d0103f014d:/usr/local/tomcat/webapps/demo/WEB-INF/lib/
[root@k8s01 ~]# docker attach 00d0103f014d

root@00d0103f014d:/usr/local/tomcat# ls -lrt /usr/local/tomcat/webapps/demo/WEB-INF/lib/
total 2956
-rw-r--r--. 1 root root  985600 Jun 12  2016 mysql-connector-java-5.1.37.jar
-rw-r--r--. 1 root root 2036609 Sep 24 04:59 mysql-connector-java-8.0.11.jar
root@00d0103f014d:/usr/local/tomcat# cd /usr/local/tomcat/webapps/demo/WEB-INF/lib/
root@00d0103f014d:/usr/local/tomcat/webapps/demo/WEB-INF/lib# mv mysql-connector-java-5.1.37.jar mysql-connector-java-5.1.37.jar_bak
root@00d0103f014d:/usr/local/tomcat/webapps/demo/WEB-INF/lib# ls -lrt
total 2956
-rw-r--r--. 1 root root  985600 Jun 12  2016 mysql-connector-java-5.1.37.jar_bak
-rw-r--r--. 1 root root 2036609 Sep 24 04:59 mysql-connector-java-8.0.11.jar

# 对现有image 做提交,并保存下来
[root@k8s01 ~]# docker ps
CONTAINER ID        IMAGE                                                        COMMAND                  CREATED             STATUS              PORTS               NAMES
00d0103f014d        kubeguide/tomcat-app:v1                                      "/bin/bash"              5 minutes ago       Up 5 minutes        8080/tcp            epic_euclid
dfa8a622c286        kubeguide/tomcat-app:v1                                      "catalina.sh run"        36 minutes ago      Up 36 minutes                           k8s_myweb.6cfa4229_myweb-pnpfl_default_f11d8bcb-bfb5-11e8-8eb0-080027104eb1_c9e8805c
da1dc5d7e9ce        kubeguide/tomcat-app:v1                                      "catalina.sh run"        36 minutes ago      Up 36 minutes                           k8s_myweb.6cfa4229_myweb-lz39h_default_f111f0a9-bfb5-11e8-8eb0-080027104eb1_50beb441
f91e2947dca9        registry.access.redhat.com/rhel7/pod-infrastructure:latest   "/usr/bin/pod"           36 minutes ago      Up 36 minutes                           k8s_POD.24f70ba9_myweb-pnpfl_default_f11d8bcb-bfb5-11e8-8eb0-080027104eb1_7d550d4f
5f9775645d02        registry.access.redhat.com/rhel7/pod-infrastructure:latest   "/usr/bin/pod"           36 minutes ago      Up 36 minutes                           k8s_POD.24f70ba9_myweb-lz39h_default_f111f0a9-bfb5-11e8-8eb0-080027104eb1_384d575c
8b4f109879c3        mysql                                                        "docker-entrypoint..."   2 hours ago         Up 2 hours                              k8s_mysql.f6601b53_mysql-qjfb9_default_b98e0e93-bfa5-11e8-8eb0-080027104eb1_1e500e77
b21ecfd57466        registry.access.redhat.com/rhel7/pod-infrastructure:latest   "/usr/bin/pod"           2 hours ago         Up 2 hours                              k8s_POD.1d520ba5_mysql-qjfb9_default_b98e0e93-bfa5-11e8-8eb0-080027104eb1_c70efb71

[root@k8s01 ~]# docker commit -m "tomcat" -a "241374050" 00d0103f014d 241374050/tomcat:v2
sha256:717db5b75338b6c9f3829261f63cc64ee3b9071bb41e693a51976cc6850073c4
[root@k8s01 ~]# docker images
REPOSITORY                                            TAG                 IMAGE ID            CREATED             SIZE
241374050/tomcat                                      v2                  717db5b75338        4 seconds ago       361 MB
docker.io/mysql                                       latest              6a834f03bd02        2 weeks ago         484 MB
registry.access.redhat.com/rhel7/pod-infrastructure   latest              99965fb98423        11 months ago       209 MB
docker.io/kubeguide/tomcat-app                        v1                  a29e200a18e9        2 years ago         358 MB
[root@k8s01 ~]#

# 其中,-m指定说明信息;-a指定用户信息;00d0103f014d 代表容器的id;241374050/tomcat:v2 指定目标镜像的用户名、仓库名和 tag 信息。

# 替换jdbc后的image将作为新的container 连接 mysql。因此需要为新的container定义rc和svc。 
[root@k8s01 ~]# cp myweb-rc.yaml myweb-rc-1.yaml
[root@k8s01 ~]# cp myweb-svc.yaml myweb-svc-1.yaml

# 除了要修改image,同时全局唯一的myweb修改为myweb1,且nodePort需要改成新端口30003,简便起见也将副本数量改成1
[root@k8s01 ~]# vi myweb-rc-1.yaml
apiVersion: v1
kind: ReplicationController
metadata:
  name: myweb1
spec:
  replicas: 1
  selector:
    app: myweb1
  template:
    metadata:
      labels:
        app: myweb1
    spec:
      containers:
      - name: myweb1
        # image: kubeguide/tomcat-app:v1
          image: 241374050/tomcat:v2   #使用自己保存过的image
        ports:
        - containerPort: 8080
        env:
        - name: MYSQL_SERVICE_HOST
          value: 172.17.0.2
        - name: MYSQL_SERVICE_PORT
          value: '3306'

[root@k8s01 ~]# vi myweb-svc-1.yaml
apiVersion: v1
kind: Service
metadata:
    name: myweb1
spec:
    type: NodePort
    ports:
        - port: 8080
          nodePort: 30003
    selector:
        app: myweb1


[root@k8s01 ~]# kubectl create -f myweb-rc-1.yaml
replicationcontroller "myweb1" created

[root@k8s01 ~]# kubectl create -f myweb-svc-1.yaml
service "myweb1" created

# 但是pod启动后,发现一直在报错,且RESTARTS一直在增加表示master在一次次重启container
[root@k8s01 ~]# kubectl get pod
NAME           READY     STATUS             RESTARTS   AGE
mysql-qjfb9    1/1       Running            0          2h
myweb-lz39h    1/1       Running            0          57m
myweb-pnpfl    1/1       Running            0          57m
myweb1-pgw0s   0/1       CrashLoopBackOff   4          2m
myweb1-zrjw8   0/1       CrashLoopBackOff   4          2m


# 需要看看新的镜像为何启动报错,且无法分配ep,则手动run一个该image,该container与前面独立,互不干涉。
[root@k8s01 ~]# docker run -it 241374050/tomcat:v2 /bin/bash
root@11465bf087eb:/usr/local/tomcat# catalina.sh start
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr/lib/jvm/java-7-openjdk-amd64/jre
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.

# 使用curl测试,可以获取tomcat主页
root@11465bf087eb:/usr/local/tomcat# curl 127.0.0.1:8080  

# 但是使用demo时,项目无法初始化,报错
root@11465bf087eb:/usr/local/tomcat# curl 127.0.0.1:8080/demo/
java.lang.UnsupportedClassVersionError: com/mysql/jdbc/Driver : Unsupported major.minor version 52.0 (unable to load class com.mysql.jdbc.Driver)

# 因为demo项目时jdk7开发,更换的mysql-connector-java-8.0.11.jar 是基于jdk8,当访问demo时,因不兼容,导致调用失败。
# demo项目 jdbc版本太旧。 坑3, 默认的tomcat image中项目使用的jdk版本是7(5.2),相应jdbc是5.1,而默认mysql image中允许的jdbc版本最低是8,且对应jdk8(5.2)。
# 此时,为了演示成功,tomcat的demo项目时必须使用的,那么就考虑更换mysql版本,即使用mysql5.7的docker image。

[root@k8s01 ~]# docker search mysql
INDEX       NAME                                                             DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
docker.io   docker.io/mysql                                                  MySQL is a widely used, open-source relati...   6990      [OK]
docker.io   docker.io/mariadb                                                MariaDB is a community-developed fork of M...   2236      [OK]
docker.io   docker.io/mysql/mysql-server                                     Optimized MySQL Server Docker images. Crea...   513                  [OK]
docker.io   docker.io/percona                                                Percona Server is a fork of the MySQL rela...   369       [OK]
docker.io   docker.io/zabbix/zabbix-server-mysql                             Zabbix Server with MySQL database support       127                  [OK]
docker.io   docker.io/hypriot/rpi-mysql                                      RPi-compatible Docker Image with Mysql          96
docker.io   docker.io/zabbix/zabbix-web-nginx-mysql                          Zabbix frontend based on Nginx web-server ...   68                   [OK]
docker.io   docker.io/centurylink/mysql                                      Image containing mysql. Optimized to be li...   59                   [OK]
docker.io   docker.io/1and1internet/ubuntu-16-nginx-php-phpmyadmin-mysql-5   ubuntu-16-nginx-php-phpmyadmin-mysql-5          44                   [OK]
docker.io   docker.io/centos/mysql-57-centos7                                MySQL 5.7 SQL database server                   39
docker.io   docker.io/mysql/mysql-cluster                                    Experimental MySQL Cluster Docker images. ...   34
docker.io   docker.io/tutum/mysql                                            Base docker image to run a MySQL database ...   32
docker.io   docker.io/schickling/mysql-backup-s3                             Backup MySQL to S3 (supports periodic back...   23                   [OK]
docker.io   docker.io/bitnami/mysql                                          Bitnami MySQL Docker Image                      19                   [OK]
docker.io   docker.io/linuxserver/mysql                                      A Mysql container, brought to you by Linux...   16
docker.io   docker.io/zabbix/zabbix-proxy-mysql                              Zabbix proxy with MySQL database support        15                   [OK]
docker.io   docker.io/centos/mysql-56-centos7                                MySQL 5.6 SQL database server                   10
docker.io   docker.io/circleci/mysql                                         MySQL is a widely used, open-source relati...   6
docker.io   docker.io/openshift/mysql-55-centos7                             DEPRECATED: A Centos7 based MySQL v5.5 ima...   6
docker.io   docker.io/mysql/mysql-router                                     MySQL Router provides transparent routing ...   4
docker.io   docker.io/jelastic/mysql                                         An image of the MySQL database server main...   1
docker.io   docker.io/openzipkin/zipkin-mysql                                Mirror of https://quay.io/repository/openz...   1
docker.io   docker.io/ansibleplaybookbundle/mysql-apb                        An APB which deploys RHSCL MySQL                0                    [OK]
docker.io   docker.io/cloudfoundry/cf-mysql-ci                               Image used in CI of cf-mysql-release            0
docker.io   docker.io/cloudposse/mysql                                       Improved `mysql` service with support for ...   0                    [OK]


# 找到一个mysql5.7的image,pull下来
[root@k8s01 ~]# docker pull docker.io/centos/mysql-57-centos7
Using default tag: latest
Trying to pull repository docker.io/centos/mysql-57-centos7 ...
latest: Pulling from docker.io/centos/mysql-57-centos7
256b176beaff: Pull complete
efb19fea0fdb: Pull complete
b4570fdc208c: Pull complete
213e4e250552: Pull complete
63f85aa3129f: Pull complete
fa602875dfe8: Pull complete
68f544f308c0: Pull complete
d9559e104974: Pull complete
7275a92d5226: Pull complete
Digest: sha256:d42718d13b5ff10d61e1d560d225428ba2837f8d36dc38b6957b39cc0006f144
Status: Downloaded newer image for docker.io/centos/mysql-57-centos7:latest
[root@k8s01 ~]# docker images
REPOSITORY                                            TAG                 IMAGE ID            CREATED             SIZE
241374050/tomcat                                      v2                  717db5b75338        About an hour ago   361 MB
docker.io/centos/mysql-57-centos7                     latest              aa73af2338a4        4 days ago          445 MB
docker.io/mysql                                       latest              6a834f03bd02        2 weeks ago         484 MB
registry.access.redhat.com/rhel7/pod-infrastructure   latest              99965fb98423        11 months ago       209 MB
docker.io/kubeguide/tomcat-app                        v1                  a29e200a18e9        2 years ago         358 MB


# 为了使用这个新的image,docker.io/centos/mysql-57-centos7,需要配置新的rc和svc
# 新的container启动与原有mysql container没有任何冲突,但是全局唯一的lable必须更改;在给mysql57 分配nodePort时,要注意避免冲突;另外myweb的MYSQL_SERVICE_HOST 也需要指向mysql57的ep

[root@k8s01 ~]# kubectl get pod
NAME          READY     STATUS    RESTARTS   AGE
mysql-qjfb9   1/1       Running   0          3h
myweb-267nw   1/1       Running   0          5m
myweb-jgnf8   1/1       Running   0          5m

[root@k8s01 ~]# cp mysql-rc.yaml mysql-rc1.yaml
[root@k8s01 ~]# cp mysql-svc.yaml mysql-svc1.yaml
[root@k8s01 ~]# vi mysql-rc1.yaml
apiVersion: v1
kind: ReplicationController
metadata:
  name: mysql1      #改        
spec:
  replicas: 1           
  selector:
    app: mysql1       #改       
  template:              
    metadata:
      labels:
        app: mysql1     #改       
    spec:
      containers:         
      - name: mysql1     #改     
        #image: mysql      
        image: centos/mysql-57-centos7
        ports:
        - containerPort: 3306     
        env:
        - name: MYSQL_ROOT_PASSWORD  
          value: "123456"


[root@k8s01 ~]# vi mysql-svc1.yaml
apiVersion: v1
kind: Service             
metadata:
    name: mysql1      #改        
spec:
    type: NodePort        
    ports:
        - port: 3306      
          nodePort: 30004    #改
    selector:
        app: mysql1        

[root@k8s01 ~]# kubectl create -f mysql-rc1.yaml
replicationcontroller "mysql1" created
[root@k8s01 ~]# kubectl create -f mysql-svc1.yaml

[root@k8s01 ~]# kubectl get pod -o wide --all-namespaces
NAMESPACE   NAME           READY     STATUS    RESTARTS   AGE       IP           NODE
default     mysql-qjfb9    1/1       Running   0          4h        172.17.0.2   127.0.0.1
default     mysql1-rtr8x   1/1       Running   0          39s       172.17.0.5   127.0.0.1
default     myweb-267nw    1/1       Running   0          14m       172.17.0.3   127.0.0.1
default     myweb-jgnf8    1/1       Running   0          14m       172.17.0.4   127.0.0.1

# 确认mysql1的ep分配成功,因为myweb需要对应ip信息
[root@k8s01 ~]# kubectl get ep
NAME         ENDPOINTS                         AGE
kubernetes   10.0.2.15:6443                    4h
mysql        172.17.0.2:3306                   3h
mysql1       172.17.0.5:3306                   50s
myweb        172.17.0.3:8080,172.17.0.4:8080   15m

# 重新配置MYSQL_SERVICE_HOST
[root@k8s01 ~]# kubectl delete -f myweb-rc.yaml
replicationcontroller "myweb" deleted

[root@k8s01 ~]# vi myweb-rc.yaml
apiVersion: v1
kind: ReplicationController
metadata:
  name: myweb
spec:
  replicas: 2
  selector:
    app: myweb
  template:
    metadata:
      labels:
        app: myweb
    spec:
      containers:
      - name: myweb
        image: kubeguide/tomcat-app:v1
        # image: 241374050/tomcat:v2
        ports:
        - containerPort: 8080
        env:
        - name: MYSQL_SERVICE_HOST
          value: 172.17.0.5             #改
        - name: MYSQL_SERVICE_PORT
          value: '3306'

[root@k8s01 ~]# kubectl create -f myweb-rc.yaml
replicationcontroller "myweb" created

[root@k8s01 ~]# kubectl get pod
NAME           READY     STATUS    RESTARTS   AGE
mysql-qjfb9    1/1       Running   0          4h
mysql1-rtr8x   1/1       Running   0          5m
myweb-cwlrq    1/1       Running   0          21s
myweb-lq1g5    1/1       Running   0          21s
[root@k8s01 ~]#
[root@k8s01 ~]# kubectl get services
NAME         CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
kubernetes   10.254.0.1       <none>        443/TCP          4h
mysql        10.254.40.213    <nodes>       3306:30002/TCP   3h
mysql1       10.254.231.157   <nodes>       3306:30004/TCP   5m
myweb        10.254.254.203   <nodes>       8080:30001/TCP   20m


#至此,http://127.0.0.1:30001/demo/ 终于正常显示,并且完成数据库初始化,然后在页面输入插入一行记录,成功!

 

 

 

 

## 如果关闭防火墙后仍有通信问题,可以尝试手动开放30001端口,然后禁用防火墙。
[root@k8s01 ~]# systemctl start firewalld
[root@k8s01 ~]# firewall-cmd --zone=public --add-port=30001/tcp --permanent
Warning: ALREADY_ENABLED: 30001:tcp
success
[root@k8s01 ~]# systemctl stop firewalld
[root@k8s01 ~]# systemctl disable firewalld
[root@k8s01 ~]# systemctl status firewalld


总结:
1)最后看来,实际上就是“换了mysql5.7的镜像”就把事情解决了。但如果真有人一开始就告诉我,那么我将会错过不少东西。
为了诊断问题,首先学会了describe,并且理解rc和svc的关系,理解了nodePort,手动pull了image,体会了各container隔离性,学会使用docker cp,并attache container进行问题诊断,等等。。。
2)实践永远是检验真理的唯一标准。《kubernetes 权威指南纪念版》是本好书。但是里面的勘误还是相当有必要。但从另一方面说,这些内容上的失误,磨练了并帮助读者更好理解了这个入门实例。
3) 这第一个示例的入门过程从看书到爬出坑,加上整个过程重演、总结等 花了一个星期完成。如果你看到这里,仅仅是做完一遍,甚至是复制粘贴命令完成了整个过程,就准备抛到脑后了,那么很遗憾你错过了很多内容。
4)对我来说,写到这里,一顿操作猛如虎后,瞬间觉得索然无味:) 便可以继续后面的内容了。但是子曰:”温故而知新“,已经不止一次亲身体会到它的玄妙了!


以上命令、文字内容全部手敲,难免疏漏,若有错误敬请指正,谢谢!

-- To be continue --


 

Logo

开源、云原生的融合云平台

更多推荐