您的位置:首页 > 其它

Kubernetes系列01:Kubernetes入门

2017-12-09 16:30 309 查看
转自:http://blog.csdn.net/levy_cui/article/details/70215627

什么是Kubernetes?
Kubernetes是Google开源的容器集群管理系统,实现基于Docker构建容器,利用Kubernetes能很方面管理多台Docker主机中的容器。
主要功能如下:
1)将多台Docker主机抽象为一个资源,以集群方式管理容器,包括任务调度、资源管理、弹性伸缩、滚动升级等功能。
2)使用编排系统(YAML File)快速构建容器集群,提供负载均衡,解决容器直接关联及通信问题
3)自动管理和修复容器,简单说,比如创建一个集群,里面有十个容器,如果某个容器异常关闭,
那么,会尝试重启或重新分配容器,始终保证会有十个容器在运行,反而杀死多余的。

Kubernetes角色组成:
1)Pod
Pod是kubernetes的最小操作单元,一个Pod可以由一个或多个容器组成;
同一个Pod只能运行在同一个主机上,共享相同的volumes、network、namespace;
2)ReplicationController(RC)
RC用来管理Pod,一个RC可以由一个或多个Pod组成,在RC被创建后,系统会根据定义好的副本数来创建Pod数量。
在运行过程中,如果Pod数量小于定义的,就会重启停止的或重新分配Pod,反之则杀死多余的。当然,也可以动态伸缩运行的Pods规模或熟悉。
RC通过label关联对应的Pods,在滚动升级中,RC采用一个一个替换要更新的整个Pods中的Pod。
3)Service
Service定义了一个Pod逻辑集合的抽象资源,Pod集合中的容器提供相同的功能。集合根据定义的Label和selector完成,当创建一个Service后,
会分配一个Cluster IP,这个IP与定义的端口提供这个集合一个统一的访问接口,并且实现负载均衡。
4)Label
Label是用于区分Pod、Service、RC的key/value键值对; 
Pod、Service、RC可以有多个label,但是每个label的key只能对应一个;
主要是将Service的请求通过lable转发给后端提供服务的Pod集合;

Kubernetes组件组成:
1)kubectl
客户端命令行工具,将接受的命令格式化后发送给kube-apiserver,作为整个系统的操作入口。
2)kube-apiserver
作为整个系统的控制入口,以REST API服务提供接口。
3)kube-controller-manager
用来执行整个系统中的后台任务,包括节点状态状况、Pod个数、Pods和Service的关联等。
4)kube-scheduler
负责节点资源管理,接受来自kube-apiserver创建Pods任务,并分配到某个节点。
5)etcd
负责节点间的服务发现和配置共享。
6)kube-proxy
运行在每个计算节点上,负责Pod网络代理。定时从etcd获取到service信息来做相应的策略。
7)kubelet
运行在每个计算节点上,作为agent,接受分配该节点的Pods任务及管理容器,周期性获取容器状态,反馈给kube-apiserver。
8)DNS
一个可选的DNS服务,用于为每个Service对象创建DNS记录,这样所有的Pod就可以通过DNS访问服务了。

一、准备工作
测试环境:
CentOS Linux release 7.3 
docker 1.12.6
etcd-3.1.0
kubernetes-1.5.2-0.2
kubernetes-client 1.5.2
kubernetes-master 1.5.2
kubernetes-node   1.5.2

踩坑提示:
1、请核对.yaml文件的格式,有时候空格多了少了就报错,我就遇到过。
2、yaml文件中的image可以提前下载好,如docker pull kubeguide/tomcat-app:v1 避免下载时间过程问题

systemctl status firewalld
systemctl disable firewalld
systemctl stop firewalld
yum install etcd kubernetes

vi /etc/sysconfig/docker
OPTIONS='--selinux-enabled --log-driver=journald --signature-verification=false'修改为
OPTIONS='--selinux-enabled=false --log-driver=journald --signature-verification=false --insecure-registry gcr.io'

vi /etc/kubernetes/apiserver
KUBE_ADMISSION_CONTROL="--admissioncontrol=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota"
删除ServiceAccount
KUBE_ADMISSION_CONTROL="--admissioncontrol=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota"

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

二、创建DB容器(MySQL)

vi 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: mysql ------容器对应的Docker Image
        ports:
      - containerPort: 3306 --------容器暴露的端口号
      env:                   -------注入到容器的环境变量
      - name: MYSQL_ROOT_PASSWORD --------设置mysql root的密码
        value: "123456"

可能会遇到国外网络限制,无法从gcr.io拉取pause0.8.0的镜像。那么很简单,就找个可用的镜像拉取即可。 
#docker pull docker.io/kubernetes/pause
#kubectl create -f mysql-rc.yaml
replicationcontroller "mysql" created

查看下刚刚创建的RC:
#kubectl get rc
查看Pod的创建情况:
#kubectl get pods

[root@cent7-2 docker]# kubectl get rc
NAME      DESIRED   CURRENT   READY     AGE
mysql     1         1         0         23s
[root@cent7-2 docker]# kubectl get pods
NAME          READY     STATUS              RESTARTS   AGE
mysql-hgkwr   0/1       ContainerCreating   0          44s

等待一会之后变为Running状态
[root@ceph-cent7-2 docker]# kubectl get pods
NAME          READY     STATUS    RESTARTS   AGE
mysql-mwvjs   1/1       Running   0          10m

删除操作
[root@cent7-2 docker]# kubectl delete -f mysql-rc.yaml 
replicationcontroller "mysql" deleted
[root@cent7-2 docker]# kubectl get rc
No resources found.
[root@cent7-2 docker]# kubectl get pods
NAME          READY     STATUS        RESTARTS   AGE
mysql-hgkwr   0/1       Terminating   0          17m
[root@cent7-2 docker]# kubectl delete po mysql-hgkwr
pod "mysql-hgkwr" deleted

之后创建一个与之关联的kubernetes service-mysql自定义文件

#vi mysql-svc.yaml
apiVersion: v1
kind: Service
metadata:
  name: mysql
spec:
  ports:
    - port: 3306
  selector:
    app: mysql
    
运行kubectl,创建service
#kubectl create -f mysql-svc.yaml

[root@cent7-2 docker]# kubectl get svc
NAME         CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
kubernetes   10.254.0.1      <none>        443/TCP    39m
mysql        10.254.38.198   <none>        3306/TCP   21s

注意到MySQL服务被分配了一个值为10.254.38.198的Cluster IP地址,这是一个虚地址,kubernetes集群中其他新创建的Pod就可以通过service的Cluster IP+端口号3306访问它了。

三、创建WEB容器(TOMCAT)

#docker search tomcat-app
#docker images docker.io/kubeguide/tomcat-app 
#docker pull docker.io/kubeguide/tomcat-app:v1

vi myweb-rc.yaml
kind: ReplicationController
metadata:
  name: myweb
spec:
  replicas: 5
  selector:
    app: myweb
  template:
    metadata:
      labels:
        app: myweb
    spec:
      containers:
        - name: myweb
          image: kubeguide/tomcat-app:v1
          ports:
          - containerPort: 8080
          env:
          - name: MYSQL_SERVICE_HOST
            value: 'mysql'
          - name: MYSQL_SERVICE_PORT
            value: '3306'

注意到上面RC对应的Tomcat容器里引用了MYSQL_SERVICR_HOST=mysql这个环境标量,而"mysql"恰好是我们之前应以的MySQL服务的服务名。

[root@cent7-2 docker]# kubectl create -f myweb-rc.yaml 
replicationcontroller "myweb" created
[root@cent7-2 docker]# kubectl get pods
NAME          READY     STATUS              RESTARTS   AGE
mysql-mwvjs   1/1       Running             0          54m
myweb-55wwb   0/1       ContainerCreating   0          1m
myweb-m4l5b   0/1       ContainerCreating   0          1m
myweb-nlql3   0/1       ContainerCreating   0          1m
myweb-qlg90   0/1       ContainerCreating   0          1m
myweb-v19sr   0/1       ContainerCreating   0          1m

创建对应的Service
vi myweb-svc.yaml
apiVersion: v1
kind: Service
metadata:
  name: myweb
spec:
  type: NodePort
  ports:
    - port: 8080
      nodePort: 30001
  selector:
    app: myweb

#kubectl create -f myweb-svc.yaml
[root@cent7-2 docker]# kubectl get svc
NAME         CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
kubernetes   10.254.0.1       <none>        443/TCP          1h
mysql        10.254.38.198    <none>        3306/TCP         50m
myweb        10.254.134.175   <nodes>       8080:30001/TCP   10s

四、通过浏览器访问网页
浏览器访问 http://虚拟机IP:30001/demo 如果无法打开界面,可以本机操作curl 127.0.0.1:30001 这个能通就行,不用非打开界面。

参考:
Kubernetes管理Docker集群之部署篇  http://lizhenliang.blog.51cto.com/7876557/1736572/ Kubernetes之kubectl常用命令  http://blog.csdn.net/xingwangc2014/article/details/51204224 kubernetes 高可用部署 HA  http://blog.csdn.net/u012214983/article/details/52267476 Building High-Availability Clusters https://kubernetes.io/docs/admin/high-availability/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: