Kubernetes (1)

Submitted by Lizhe on Wed, 08/01/2018 - 14:50

Kubernetes 不局限于任何一种语言, 服务可以毫无困难的映射为Kubernetes的service , 通过TCP进行交互

Service 是分布式集群架构的核心, 一个Service对象拥有如下关键特征

拥有一个唯一指定的名字

拥有一个虚拟IP和端口号

能够提供某种远程服务

被映射到了提供这种服务能力的一组容器应用上

 

一个Pod是一个容器环境下的“逻辑主机”,它可能包含一个或者多个紧密相连的应用,这些应用可能是在同一个物理主机或虚拟机上。

Pod 的context可以理解成多个linux命名空间的联合

  • PID 命名空间(同一个Pod中应用可以看到其它进程)
  • 网络 命名空间(同一个Pod的中的应用对相同的IP地址和端口有权限)
  • IPC 命名空间(同一个Pod中的应用可以通过VPC或者POSIX进行通信)
  • UTS 命名空间(同一个Pod中的应用共享一个主机名称)

 

为了建立Service和Pod之间的关系, Kubernetes给每个Pod贴上一个标签, 例如给运行Mysql的pod贴上 name=mysql
然后给相应的Service定义标签选择器(Label Selector) , 比如Mysql service 的标签选择器的选择条件为 name=mysql

 

在集群管理方面, Kubernetes将集群中的机器划分为 Master节点和一群工作节点(Node)

Master 节点上运行着集群管理相关的一组进程 kube-apiserver, kube-controller-manager和kube-scheduler, 这些进程实现了整个集群的资源管理, Pod调度, 弹性伸缩, 安全控制,系统监控和就错等管理功能, 并且都是全自动完成的

Node 作为集群中的工作节点, 运行真正的应用程序, 在Node上Kubernets管理的最小运行单元是Pod. Node上运行着Kubernetes的kubelet, kube-proxy服务进程, 这些服务进程负责 Pod的创建, 启动, 监控, 重启, 销毁, 以及实现软件模式的负载均衡器

关闭防火墙

安装etcd 和 kubernetes ( 会自动安装docker )

yum install -y etcd kubernetes

按顺序启动服务

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

此处我遇到一个启动docker的错误, 可能是由于我本地的centos7 内核版本太低造成的

参考

在centos版本 7.3中用yum安装后报错出现 Error starting daemon: SELinux is not supported with the overlay2 graph driver on this kernel. Either boot in...led=false) 根据日志得知,此linux的内核中的SELinux不支持 overlay2 graph driver ,解决方法有两个,要么启动一个新内核,要么就在docker里禁用selinux,--selinux-enabled=false

重新编辑docker配置文件:

# vim /etc/sysconfig/docker

# Modify these options if you want to change the way the docker daemon runs
OPTIONS='--selinux-enabled=false --log-driver=journald --signature-verification=false'
if [ -z "${DOCKER_CERT_PATH}" ]; then
    DOCKER_CERT_PATH=/etc/docker

fi

如上改为--selinux-enabled=false后保存,重启docker,搞定!

/etc/sysconfig/docker

启动mysql服务

首先创建一个定义文件, mysql-rc.yaml 

apiVersion: v1
kind: ReplicationController
metadata:
  name: mysql
spec:
  replicas: 1
  selector:
    app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - name: mysql
        image: mysql
        ports:
        - containerPort: 3306
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: "123456"

 

kubectl create -f mysql-rc.yaml

201808012223

 

执行kubectl get pods,显示no resources found.

解决方法:
1、$ vi /etc/kubernetes/apiserver
2、找到这一行 "KUBE_ADMISSION_CONTROL="--admission_control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota",去掉ServiceAccount,保存退出。
3、重新启动kube-apiserver服务即可

此时执行kubectl get pods, no resources found问题得以解决

[root@localhost ~]# kubectl get pods
NAME          READY     STATUS              RESTARTS   AGE
mysql-x25r9   0/1       ContainerCreating   0          1m
 

一直是 ContainerCreating

kubectl describe pod mysql-x25r9

得到如下错误

Events:
  FirstSeen    LastSeen    Count    From            SubObjectPath    Type        Reason        Message
  ---------    --------    -----    ----            -------------    --------    ------        -------
  4m        4m        1    {default-scheduler }            Normal        Scheduled    Successfully assigned mysql-x25r9 to 127.0.0.1
  4m        1m        5    {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)"

  3m    10s    14    {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\""

也就是说在下载这个镜像registry.access.redhat.com/rhel7/pod-infrastructure:latest的时候出错了, 为什么出错呢

open /etc/docker/certs.d/registry.access.redhat.com/redhat-ca.crt: no such file or directory

少了一个什么证书文件, 然后去Google这证书是什么玩意

原来是一个link, 指向/etc/rhsm/ca/redhat-uep.pem

有网上的哥们写需要安装下面这个玩意

yum install *rhsm*

很可惜的是, 不知道是版本过时了还是什么原因反正就是装完以后还是不行

注意,下面这个在我本地好用了

- 运行wget http://mirror.centos.org/centos/7/os/x86_64/Packages/python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm 手动下载

- chmod +x python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm

- 运行 rpm2cpio python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm | cpio -iv --to-stdout /etc/rhsm/ca/redhat-uep.pem | tee /etc/rhsm/ca/redhat-uep.pem

然后需要手动重新调用

docker pull registry.access.redhat.com/rhel7/pod-infrastructure:latest

201808012259

然后重新查看pods状态

201808012301

通过同样的方式,我再尝试添加一个mariadb的pod

apiVersion: v1
kind: ReplicationController
metadata:
  name: mariadb
spec:
  replicas: 1
  selector:
    app: mariadb
  template:
    metadata:
      labels:
        app: mariadb
    spec:
      containers:
      - name: mariadb
        image: mariadb
        ports:
        - containerPort: 3306
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: "root"

 

[root@localhost ~]# kubectl get pods
NAME            READY     STATUS              RESTARTS   AGE
mariadb-lg38j   0/1       ContainerCreating   0          24s
mysql-x25r9     1/1       Running             0          30m
[root@localhost ~]# kubectl describe pod mariadb-lg38j
Name:        mariadb-lg38j
Namespace:    default
Node:        127.0.0.1/127.0.0.1
Start Time:    Wed, 01 Aug 2018 23:05:15 +0800
Labels:        app=mariadb
Status:        Running
IP:        172.17.0.3
Controllers:    ReplicationController/mariadb
Containers:
  mariadb:
    Container ID:    docker://8a4417abb2924e408cb1d00ebe0a4765e9adcd216c41d4519d2854c296ef6045
    Image:        mariadb
    Image ID:        docker-pullable://docker.io/mariadb@sha256:edef80de393cf4a79504168c663f8b0c6b15060333e5a7d7aee3dc0a4de6e927
    Port:        3306/TCP
    State:        Running
      Started:        Wed, 01 Aug 2018 23:05:44 +0800
    Ready:        True
    Restart Count:    0
    Volume Mounts:    <none>
    Environment Variables:
      MYSQL_ROOT_PASSWORD:    root
Conditions:
  Type        Status
  Initialized     True 
  Ready     True 
  PodScheduled     True 
No volumes.
QoS Class:    BestEffort
Tolerations:    <none>
Events:
  FirstSeen    LastSeen    Count    From            SubObjectPath            Type        Reason            Message
  ---------    --------    -----    ----            -------------            --------    ------            -------
  49s        49s        1    {default-scheduler }                    Normal        Scheduled        Successfully assigned mariadb-lg38j to 127.0.0.1
  48s        48s        1    {kubelet 127.0.0.1}    spec.containers{mariadb}    Normal        Pulling            pulling image "mariadb"
  49s        20s        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.
  20s        20s        1    {kubelet 127.0.0.1}    spec.containers{mariadb}    Normal        Pulled            Successfully pulled image "mariadb"
  20s        20s        1    {kubelet 127.0.0.1}    spec.containers{mariadb}    Normal        Created            Created container with docker id 8a4417abb292; Security:[seccomp=unconfined]
  20s        20s        1    {kubelet 127.0.0.1}    spec.containers{mariadb}    Normal        Started            Started container with docker id 8a4417abb292
[root@localhost ~]# kubectl get pods
NAME            READY     STATUS    RESTARTS   AGE
mariadb-lg38j   1/1       Running   0          1m
mysql-x25r9     1/1       Running   0          30m
 

 

 

 

这里, 可能会出现pod无法进入ready的各种状态

如果是pending 状态, 可能是进入了

no nodes available to schedule pods

重启了一次电脑和所有服务问题解决了

还有一个古怪的docker问题

Error response from daemon: error creating overlay mount to /var/lib/docker/overlay2

这个是因为用的overlay2文件系统,而系统默认只能识别overlay文件系统

#systemctl stop docker      //停掉docker服务
#rm -rf /var/lib/docker     //注意会清掉docker images的镜像
#vi /etc/sysconfig/docker-storage       //将文件里的overlay2改成overlay即可

例:DOCKER_STORAGE_OPTIONS="--storage-driver overlay "

#vi /etc/sysconfig/docker         //去掉option后面的--selinux-enabled

然后启动docker即可:systemctl start docker

 

 

创建服务 mysql-svc.yaml

apiVersion: v1
kind: Service
metadata:
  name: mysql
spec:
  ports: 
  - port: 3306
  selector:
    app: mysql

 

[root@localhost ~]# kubectl get services
NAME         CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   10.254.0.1   <none>        443/TCP   1h
[root@localhost ~]# vi mysql-svc.yaml
[root@localhost ~]# kubectl create -f mysql-svc.yaml 
service "mysql" created
 

 

 


 

 

创建tomcat pod

apiVersion: v1
kind: ReplicationController
metadata:
  name: myweb
spec:
  replicas: 3  
  selector:
    app: myweb
  template:
    metadata:
      labels:
        app: myweb
    spec:
      containers:
      - name: myweb
        image: docker.io/kubeguide/tomcat-app:v1
        ports: 
        - containerPort: 8080
        env:
        - name: MYSQL_SERVICE_HOST
          value: "mysql"
        - name: MYSQL_SERVICE_PORT
          value: "3306"

 

[root@localhost ~]# kubectl get pods
NAME            READY     STATUS    RESTARTS   AGE
mariadb-lg38j   1/1       Running   0          28m
mysql-x25r9     1/1       Running   0          58m
myweb-5dw91     1/1       Running   0          1m
myweb-mwhvd     1/1       Running   0          1m
 

创建tomcat的service 

myweb-svc.yaml

apiVersion: v1
kind: Service
metadata:
  name: myweb
spec:
  type: NodePort
  ports:
    - port: 8080
      nodePort: 30001
  selector:
    app: myweb

 

201808012338

 

 

docker exec -it 1470cfaa1b1c /bin/bash

 

https://stackoverflow.com/questions/49204339/mysql-communications-link-failure-in-kubernetes-sample