kubernetes 1

29.1 认识kubernetes
29.2 从一个例子开始

29.1 认识kubernetes

kubernetes是一个管理容器的框架。kubernetes是一个开源系统,用于自动化容器化应用程序的部署,扩展和管理。 它也简称为k8s 官网 https://kubernetes.io/zh/

kubernetes中几个概念
container 容器 提供一个让应用运行的环境。
pod 在kubernetes中的一个运行单位,里面包含任意数量的容器。通常是两个。其中有一个叫Pause的容器,它作用网络栈和挂载卷。让用一个pod中的容器通讯更加高效。
replication controller(RC)提供一个管理任意数量pod的方法。它可以复制任意数量的pod模板。让kubernetes可以对pod进行扩容 升级
service 它是所有pod的整合成的服务环境 是kubernetes核心,其使用label标签来管理pods。
node 节点 可以是一台物理机,云主机,虚拟机也可以。通常一个node可以运行多个pod。从集群上看kubernetes分一个master节点和多个node节点。 master上运行着kubeapiserverkube-controller-managerkube-scheduler,它们实现了资源管理、pod调度、弹性伸缩、安全控制、系统监 控、纠错等功能。Node是工作节点,运行应用程序,提供服务。Node上的最小单元是pod,Node上运行着kubernetesd的 kubeletkube-proxy服务进程,它们负责pod的创建、启动、监控、重启、销毁,以及实现负载均衡。

逻辑上

物理上

参考视频 https://www.bilibili.com/video/av10087636?from=search&seid=17893188254197971495

29.2 从一个例子开始

  • pod扩容和升级需要一个关键的东西,Replication controller(RC),RC需要包含3个关键信息:
    • 目标pod的定义
    • 目标pod需要运行的副本数量(replicas)
    • 要监控的目标pod的标签(Label)

工作过程:RC里定义好3个指标,kubernetes会根据RC定义的Label帅选出对应的pod,并实时监控其状态和数量,当实例数量 少于定义的副本数(replicas),则会根据RC定义的pod模版来创建新的pod,然后将此pod调度到合适的Node上启动并运行。 该过程完全自动化,无需人工干涉。

在单台机器上安装kubernetes 并安装管理mysql容器和webapp容器。

查看文章 https://www.cnblogs.com/neutronman/p/8047547.html

为了顺利安装kubernetes 先把系统升级到最新版本,并且让机器使用3G内存

1
2
3
4
5
[root@kun05 ~]# cat /etc/redhat-release  ##查看当前系统版本
CentOS Linux release 7.4.1708 (Core)
[root@kun05 ~]# yum -y update  ##升级所有软件和系统
[root@kun05 ~]# cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)

1.先关闭selinux和firewall

1
2
3
[root@kun05 ~]# systemctl stop firewalld
[root@kun05 ~]# systemctl disable firewalld
[root@kun05 ~]# setenforce 0

2.安装和etcdkubernetes (安装过程中会自动安装Docker软件)

1
[root@kun05 ~]# yum install -y etcd kubernetes

etcd是用来存储配置文件的数据库,这里用来存储k8s的配置文件,它也是分布式的

3.修改配置文件

1
[root@kun05 ~]# vim /etc/sysconfig/docker

--selinux-enabled 改为 --selinux-enabled=false --insecure-registry gcr.io

1
--selinux-enabled=false --insecure-registry gcr.io
1
[root@kun05 ~]# vim /etc/kubernetes/apiserver

--admission_control参数中的ServiceAccount删除

4.配置docker加速器

1
2
3
4
5
[root@kun05 ~]# vim /etc/docker/daemon.json

{
"registry-mirrors": ["https://dhq9bx4f.mirror.aliyuncs.com"]
}

5.分别启动服务

1
2
3
4
5
6
7
[root@kun05 ~]# systemctl start etcd
[root@kun05 ~]# systemctl start docker
[root@kun05 ~]# systemctl start kube-apiserver
[root@kun05 ~]# systemctl start kube-controller-manager
[root@kun05 ~]# systemctl start kube-scheduler
[root@kun05 ~]# systemctl start kubelet
[root@kun05 ~]# systemctl start kube-proxy

也可以使用for循环启动

1
for s in etcd docker kube-apiserver kube-controller-manager kube-scheduler kubelet kube-proxy; do  systemctl start $s; done

6.定义一个mysql的rc文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[root@kun05 ~]# vim mysql-rc.yaml

apiVersion: v1
kind: ReplicationController                            #副本控制器RC
metadata:
  name: mysql                                          #RC的名称,全局唯一
spec:
  replicas: 1                                          #Pod副本的期待数量
  selector:
    app: mysql                                         #符合目标的Pod拥有此标签
  template:                                            #根据此模板创建Pod的副本(实例)
    metadata:
      labels:
        app: mysql                                     #Pod副本拥有的标签,对应RC的Selector
    spec:
      containers:                                      #Pod内容器的定义部分
      - name: mysql                                    #容器的名称
        image: hub.c.163.com/library/mysql              #容器对应的Docker image
        ports:
        - containerPort: 3306                          #容器应用监听的端口号
        env:                                           #注入容器内的环境变量
        - name: MYSQL_ROOT_PASSWORD
          value: "123456"                              #密码

7.发布rc到集群上

1
2
[root@kun05 ~]# kubectl create -f mysql-rc.yaml
此时k8s就是去下载对应的image并启动容器

查看刚刚创建rc的状态

1
2
3
[root@kun05 ~]# kubectl get rc
NAME      DESIRED   CURRENT   READY     AGE
mysql     1         1         0         2m

查看pod的创建情况

1
2
3
4
[root@kun05 ~]# kubectl get pod
NAME          READY     STATUS              RESTARTS   AGE
mysql-32nvw   0/1       ContainerCreating   0          4m
Pod的状态处于ContainerCreating,需要等到状态为Runing才算成功

问题 创建rc中pod状态处于ContainerCreating卡死

1
2
3
4
5
6
[root@kun05 ~]# kubectl get pod
NAME          READY     STATUS              RESTARTS   AGE
mysql-32nvw   0/1       ContainerCreating   0          4m

Error syncing pod 59950974-d84a-11e8-86ca-000c2971e1ca, skipping: failed to "StartContainer" for "POD" with ImagePullBackOff: "Back-off pulling image \"registry.access.redhat.com/rhel7/pod-infrastructure:latest\""
`

参考文档 https://blog.csdn.net/d7185540/article/details/80868816
https://blog.csdn.net/gezilan/article/details/80011905

解决 缺少python-rhsm-certificates

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@kun05 ~]# yum install python-rhsm-certificates

提示
软件包 python-rhsm-certificates-1.19.10-1.el7_4.x86_64 被已安装的 subscription-manager-rhsm-certificates-1.20.11-1.el7.centos.x86_64 取代
无须任何处理

[root@kun05 ~]# wget http://mirror.centos.org/centos/7/os/x86_64/Packages/python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm

[root@kun05 ~]# rpm2cpio python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm |cpio -iv --to-stdout ./etc/rhsm/ca/redhatuep.pem >  /etc/rhsm/ca/redhat-uep.pem

[root@kun05 ~]# kubectl delete -f mysql-rc.yaml ##先删除刚才的rc再创建
[root@kun05 ~]# kubectl create -f mysql-rc.yaml

[root@kun05 ~]# kubectl get pod
NAME          READY     STATUS        RESTARTS   AGE
mysql-x4rwx   1/1       Running       0          8m

Running表示已经启动为容器

8.定义一个mysql的svc/servce文件

1
2
3
4
5
6
7
8
9
10
11
[root@kun05 ~]# vim mysql-svc.yaml

apiVersion: v1
kind: Service                              #表明是K8s Service
metadata:
  name: mysql                              #Service的全局唯一名称
spec:
  ports:
    - port: 3306                           #Service提供服务的端口号
  selector:                                #Service对应的Pod拥有这里定义的标签
    app: mysql

9.发布service到集群上

1
2
3
4
5
6
[root@kun05 ~]# kubectl create -f mysql-svc.yaml

[root@kun05 ~]# kubectl get svc
NAME         CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE
kubernetes   10.254.0.1     <none>        443/TCP    52m
mysql        10.254.75.46   <none>        3306/TCP   2m

不同的service之间都是通过CLUSTER-IP来实现通讯的

10.定义一个webapp的rc文件并发布

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
[root@kun05 ~]# vim web-rc.yaml

apiVersion: v1
kind: ReplicationController
metadata:
  name: myweb
spec:
  replicas: 1
  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: "10.254.75.46"               #这里的IP需要通过kubect get svc 查看mysql的cluster ip
        - name: MYSQL_SERVICE_PORT
          value: "3306"

[root@kun05 ~]# kubectl create -f web-rc.yaml

11.定义一个webapp的svc文件并发布

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[root@kun05 ~]# vim web-svc.yaml

apiVersion: v1
kind: Service
metadata:
  name: myweb
spec:
  type: NodePort
  ports:
    - port: 8080         ##容器的端口
      nodePort: 30001    ##映射到物理机的端口
  selector:
    app: myweb

[root@kun05 ~]# kubectl create -f web-svc.yaml

[root@kun05 ~]# kubectl get svc
NAME         CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
kubernetes   10.254.0.1       <none>        443/TCP          2h
mysql        10.254.75.46     <none>        3306/TCP         1h
myweb        10.254.156.235   <nodes>       8080:30001/TCP   18s

12.使用curl和浏览器测试

1
2
3
[root@kun05 ~]# iptables -P FORWARD ACCEPT

[root@kun05 ~]# curl http://192.168.80.105:30001 -I

猜你喜欢

转载自blog.csdn.net/xiaoyuerp/article/details/84758512