k8s基础知识介绍-创新互联

今天小编就为大家带来一篇介绍k8s基础知识的文章。小编觉得挺实用的,为此分享给大家做个参考。一起跟随小编过来看看吧。

创新互联建站是一家专业提供金城江企业网站建设,专注与成都网站制作、成都网站设计、外贸营销网站建设成都h5网站建设、小程序制作等业务。10年已为金城江众多企业、政府机构等服务。创新互联专业的建站公司优惠进行中。

自动化运维
平台化(ansible、git、gitlab、docker、jenkins、elk)
自动化(工具/脚本)
容器化(docker/k8s)
虚拟化

docker和虚拟机的区别
更高效的资源利用。虚拟机是一个完备的系统,容器只是一个进程。

虚拟机启动慢,容器是秒级
一致的运行环境
CI/CD
容器核心概念
镜像Image
(1)镜像是一个特殊的文件系统。它除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(例如环境变量)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。
(2)镜像采用的是AUFS,实现分层结构。镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。镜像是只读的。创建新镜像时,底层内容不变,只是给镜像增加了一个新层次。
容器Container
(1)容器可以认为是镜像的一次执行,是可读写的镜像。容器只是操作系统上的一个进程,进程执行完毕将会退出。不要假定容器会一直存在,应该假设它随时会崩溃。容器一旦出现故障,不要犹豫,直接将它删除,再启动一个。
(2)按照 Docker 最佳实践的要求,容器不应该向其存储层内写入任何数据,容器存储层要保持无状态化。所有的文件写入操作,都应该使用 数据卷(Volume)、或者绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。
仓库Repository
仓库是镜像仓库,负责对Docker镜像进行管理的(类似仓库管理员),每个仓库可以包含多个标签(Tag),每个标签对应一个镜像。也可以自己创建私有仓库。
k8s组成
这个集群主要包括两个部分:
一个Master节点(主节点):用于对容器进行控制、调度,一般是物理服务器,
一群Node节点(计算节点):工作负载节点,里面是具体的容器,可以是物理服务器,也可以是云主机

补充:
Pod是Kubernetes最基本的操作单元。一个Pod代表着集群中运行的一个进程,它内部封装了一个或多个紧密相关的容器。除了Pod之外,K8S还有一个Service的概念,一个Service可以看作一组提供相同服务的Pod的对外访问接口。

k8s架构图

k8s工作流程图简述

k8s配置及简单应用
1、作为master安装k8s(node11:192.168.4.11),同时作为node节点安装docker
2、修改docker配置文件,使之可以使用物理机上的私有镜像仓库

[root@node11 k8s_pkgs]# vim /etc/sysconfig/docker
OPTIONS='--selinux-enabled=false ...        //关闭selinux
[root@node11 k8s_pkgs]# vim /etc/docker/daemon.json
{
"insecure-registries": ["192.168.4.254:5000"]
}
#################################################################################
[root@room9pc01 images]# docker images      //物理机(192.168.4.254)搭建私有镜像仓库如下
REPOSITORY                                            TAG                 IMAGE ID            CREATED             SIZE
192.168.8.254:5000/mysql                              latest              7bb2586065cd        10 weeks ago        476.9 MB
192.168.8.254:5000/pod-infrastructure                 latest              99965fb98423        19 months ago       208.6 MB
192.168.8.254:5000/guestbook-php-frontend             latest              47ee16830e89        2 years ago         510 MB
192.168.8.254:5000/tomcat-app                         latest              a29e200a18e9        2 years ago         358.2 MB
192.168.8.254:5000/redis-master                       latest              405a0b586f7e        3 years ago         419.1 MB
192.168.8.254:5000/guestbook-redis-slave              latest              e0c36a1fa372        3 years ago         109.5 MB
1
3、启动相关服务
k8s—master:
etcd:是一个数据库,保存了整个集群的状态
kube-apiserver:执行指令,提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制
kube-controller-manager:MT5实际操作www.gendan5.com/mt5.html 控制管理器,负责维护集群的状态,比如故障检测、自动扩展、滚动更新等
kube-scheduler:负责资源的调度,按照预定的调度策略将Pod调度到相应的机器上

k8s—node:
kubelet:接受指令的node节点(k8s客户端),负责维护容器的生命周期,同时也负责Volume(CVI)和网络(CNI)的管理
kube-proxy:代理节点,负责为Service提供cluster内部的服务发现和负载均衡
docker:真正的容器服务,负责镜像管理以及Pod和容器的真正运行

[root@node11 k8s_pkgs]# rpm -q docker
docker-1.13.1-91.git07f3374.el7.centos.x86_64
#master的组件
[root@node11 kubernetes]# systemctl start etcd
[root@node11 kubernetes]# systemctl enable etcd
[root@node11 k8s_pkgs]# systemctl start kube-apiserver.service
[root@node11 k8s_pkgs]# systemctl enable kube-apiserver.service
[root@node11 k8s_pkgs]# systemctl start kube-controller-manager.service
[root@node11 k8s_pkgs]# systemctl enable kube-controller-manager.service
[root@node11 k8s_pkgs]# systemctl start kube-scheduler.service
[root@node11 k8s_pkgs]# systemctl enable kube-scheduler.service
#node的组件
[root@node11 k8s_pkgs]# systemctl start docker
[root@node11 k8s_pkgs]# systemctl enable docker
[root@node11 k8s_pkgs]# systemctl start kubelet.service
[root@node11 k8s_pkgs]# systemctl enable kubelet.service
[root@node11 k8s_pkgs]# systemctl start kube-proxy.service
[root@node11 k8s_pkgs]# systemctl enable kube-proxy.service

4、修改配置,重启服务

[root@node11 k8s_pkgs]# ls /etc/kubernetes/
apiserver  config  controller-manager  kubelet  proxy  scheduler
[root@node11 k8s_pkgs]# vim /etc/kubernetes/apiserver
KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"      //允许任何主机均可以访问本机
把ServiceAccount从KUBE_ADMISSION_CONTROL中删除       //删除服务帐号
[root@node11 k8s_pkgs]# systemctl restart kube-apiserver.service
[root@node11 k8s_pkgs]# vim /etc/kubernetes/config
KUBE_MASTER="--master=http://192.168.4.11:8080"     //指定master的ip地址
[root@node11 k8s_pkgs]# vim /etc/kubernetes/kubelet
KUBELET_ADDRESS="--address=0.0.0.0"     //定义客户端运行在所有地址上,便于master远程管理
KUBELET_API_SERVER="--api-servers=http://192.168.4.11:8080"     //客户端指定服务器地址和ip
KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=192.168.4.254:5000/pod-infrastructure"     //指定pod(容器组)的私有镜像仓库
[root@node11 k8s_pkgs]# systemctl restart kubelet

5、应用测试tomcat+mysql

[root@node11 tomcat_mysql]# vim mysql-rc.yaml           /创建mysql的rc声明文件
apiVersion: v1
kind: ReplicationController     //类型声明
metadata:
name: mysql           //rc名称
spec:           //文件声明
replicas: 1       //要求标签是app:mysql的pod数目是1
selector:     //选择器,查找标签是app:mysql的pod
app: mysql
template:     //如果pod数目不达标,创建满足以下条件的pod
metadata:
labels:
app: mysql
spec:
containers:

  • name: mysql
    image: 192.168.4.254:5000/mysql     //私有镜像仓库
    ports:
    • containerPort: 3306
      env:
    • name: MYSQL_ROOT_PASSWORD
      value: "123456"

#根据yaml文件创建相关资源
[root@node11 tomcat_mysql]# kubectl create -f mysql-rc.yaml     //启动一个名称为mysql的rc容器
[root@node11 tomcat_mysql]# kubectl get rc      //获取容器信息
NAME      DESIRED   CURRENT   READY     AGE
mysql     1         1         1         1h
[root@node11 tomcat_mysql]# kubectl get pod     //该pod容器组包含一个基础架构容器和mysql容器
NAME          READY     STATUS    RESTARTS   AGE
mysql-v0pdr   1/1       Running   0          1h

#查看到pod后,查看其详细消息
[root@node11 tomcat_mysql]# kubectl describe pod    mysql-v0pdr //查看pod信息
[root@node11 tomcat_mysql]# docker ps

#创建mysql服务
[root@node11 tomcat_mysql]# vim mysql-svc.yaml      //启动mysql容器服务脚本
apiVersion: v1
kind: Service
metadata:
name: mysql
spec:
ports:

  • port: 3306
    selector:
    app: mysql
    [root@node11 tomcat_mysql]# kubectl create -f mysql-svc.yaml        //启动mysql容器的mysql服务
    [root@node11 tomcat_mysql]# kubectl get services        //查看启动的服务
    NAME         CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
    kubernetes   10.254.0.1       <none>        443/TCP    4h
    mysql        10.254.164.241   <none>        3306/TCP   7mmysql服务没有EXTERNAL-IP,因为用户不直接访问mysql,而是访问web服务

#创建web服务
[root@node11 tomcat_mysql]# vim myweb-rc.yaml       //启动comcat容器脚本
kind: ReplicationController
metadata:
name: myweb
spec:
replicas: 5       //副本个数
selector:
app: myweb
template:
metadata:
labels:
app: myweb
spec:
containers:

  • name: myweb
    image: 192.168.4.254:5000/tomcat-app      //私有仓库镜像
    ports:
    • containerPort: 8080
      env:
    • name: MYSQL_SERVICE_HOST        //连接mysql容器
      value: 'mysql'
    • name: MYSQL_SERVICE_PORT
      value: '3306'
      [root@node11 tomcat_mysql]# kubectl create -f myweb-rc.yaml
      [root@node11 tomcat_mysql]# kubectl get rc
      NAME      DESIRED   CURRENT   READY     AGE
      mysql     1         1         1         2h
      myweb     5         5         5         35s
      [root@node11 tomcat_mysql]# kubectl get pods
      NAME          READY     STATUS    RESTARTS   AGE
      mysql-v0pdr   1/1       Running   0          2h
      myweb-jsb1k   1/1       Running   0          47s
      myweb-kl2gk   1/1       Running   0          47s
      myweb-l1qvq   1/1       Running   0          47s
      myweb-p0n7g   1/1       Running   0          47s
      myweb-sh7jl   1/1       Running   0          47s
      [root@node11 tomcat_mysql]# vim myweb-svc.yaml      //myweb服务脚本
      apiVersion: v1
      kind: Service
      metadata:
      name: myweb
      spec:
      type: NodePort
      ports:
      • port: 8080            //以下两行表示访问node的30001,将会映射到pod的8080
        nodePort: 30001
        selector:
        app: myweb
        [root@node11 tomcat_mysql]# kubectl create -f myweb-svc.yaml        //启动myweb服务
        [root@node11 tomcat_mysql]# kubectl get service
        NAME         CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
        kubernetes   10.254.0.1       <none>        443/TCP          4h
        mysql        10.254.164.241   <none>        3306/TCP         30m
        myweb        10.254.222.24    <nodes>       8080:30001/TCP   26s  
        [root@node11 tomcat_mysql]# docker ps |awk '{print $2}'
        ID
        192.168.4.254:5000/tomcat-app
        192.168.4.254:5000/tomcat-app
        192.168.4.254:5000/tomcat-app
        192.168.4.254:5000/tomcat-app
        192.168.4.254:5000/tomcat-app
        192.168.4.254:5000/pod-infrastructure       //myweb基础架构容器
        192.168.4.254:5000/pod-infrastructure
        192.168.4.254:5000/pod-infrastructure
        192.168.4.254:5000/pod-infrastructure
        192.168.4.254:5000/pod-infrastructure
        192.168.4.254:5000/mysql
        192.168.4.254:5000/pod-infrastructure       //mysql基础架构容器
        #myweb将启动5个pod和10个容器,因为每个pod需要有一个基础架构容器,还需要有一个工作容器,同理mysql也会启动1个pod和一个容器

浏览器访问http://192.168.4.11:30001/
删除一个容器后,k8s会发现容器数目已经少于rc声明,它会自动创建新的对应容器

[root@node11 tomcat_mysql]# docker rm -f c1bf3822f088
[root@node11 tomcat_mysql]# docker ps
1
2
如果想要动态调整pod数目,只是将rc改个数即可

[root@node11 tomcat_mysql]# kubectl scale --replicas=3 replicationcontroller myweb      //将myweb容器个数调整为3个
[root@node11 tomcat_mysql]# kubectl  get rc
NAME      DESIRED   CURRENT   READY     AGE
mysql     1         1         1         1h
myweb     3         3         3         36m
[root@node11 tomcat_mysql]# kubectl get pod
NAME          READY     STATUS    RESTARTS   AGE
mysql-hg9z0   1/1       Running   0          58m
myweb-3g6rz   1/1       Running   0          32m
myweb-90jts   1/1       Running   0          32m
myweb-rvrr1   1/1       Running   0          32m
[root@node11 tomcat_mysql]# docker ps -a |awk '{print $2}'      //docker个数也自动调整
ID
192.168.4.254:5000/tomcat-app
192.168.4.254:5000/tomcat-app
192.168.4.254:5000/tomcat-app
192.168.4.254:5000/pod-infrastructure
192.168.4.254:5000/pod-infrastructure
192.168.4.254:5000/pod-infrastructure
192.168.4.254:5000/mysql
192.168.4.254:5000/pod-infrastructure

删除服务(pod也称微服务)、rc

[root@node11 tomcat_mysql]# kubectl delete service mysql
service "mysql" deleted
[root@node11 tomcat_mysql]# kubectl delete service myweb
service "myweb" deleted
[root@node11 tomcat_mysql]# kubectl delete rc mysql
replicationcontroller "mysql" deleted
[root@node11 tomcat_mysql]# kubectl delete rc myweb
replicationcontroller "myweb" deleted
[root@node11 tomcat_mysql]# docker ps       //无容器运行

php-redis主从

#redis-master
[root@node11 php_redis]# ls
frontend-controller.yaml  redis-master-controller.yaml  redis-slave-controller.yaml
frontend-service.yaml     redis-master-service.yaml     redis-slave-service.yaml
[root@node11 php_redis]# vim redis-master-controller.yaml
piVersion: v1
kind: ReplicationController
metadata:
name: redis-master
labels:
name: redis-master
spec:
replicas: 1
selector:
name: redis-master
template:
metadata:
labels:
name: redis-master
spec:
containers:

  • name: master
    image: 192.168.4.254:5000/redis-master
    ports:
    • containerPort: 6379
      [root@node11 php_redis]# kubectl create -f redis-master-controller.yaml
      [root@node11 php_redis]# vim redis-master-service.yaml
      apiVersion: v1
      kind: Service
      metadata:
      name: redis-master
      labels:
      name: redis-master
      spec:
      ports:
      • port: 6379
        targetPort: 6379
        selector:
        name: redis-master
        [root@node11 php_redis]# kubectl create -f redis-master-service.yaml

#redis-slave
[root@node11 php_redis]# vim redis-slave-controller.yaml
apiVersion: v1
kind: ReplicationController
metadata:
name: redis-slave
labels:
name: redis-slave
spec:
replicas: 2
selector:
name: redis-slave
template:
metadata:
labels:
name: redis-slave
spec:
containers:

  • name: slave
    image: 192.168.4.254:5000/guestbook-redis-slave
    env:
    • name: GET_HOSTS_FORM
      value: env
      ports:
    • containerPort: 6379
      [root@node11 php_redis]# vim redis-slave-service.yaml
      apiVersion: v1
      kind: Service
      metadata:
      name: redis-slave
      labels:
      name: redis-slave
      spec:
      ports:
      • port: 6379
        selector:
        name: redis-slave
        [root@node11 php_redis]# kubectl create -f redis-slave-service.yaml
        [root@node11 php_redis]# kubectl get rc
        NAME           DESIRED   CURRENT   READY     AGE
        redis-master   1         1         1         9m
        redis-slave    2         2         2         1m
        [root@node11 php_redis]# kubectl get pod
        NAME                 READY     STATUS    RESTARTS   AGE
        redis-master-cn208   1/1       Running   0          9m
        redis-slave-dctvw    1/1       Running   0          1m
        redis-slave-gxtfs    1/1       Running   0          1m
        [root@node11 php_redis]# kubectl get service
        NAME           CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
        kubernetes     10.254.0.1       <none>        443/TCP    9h
        redis-master   10.254.174.239   <none>        6379/TCP   8m
        redis-slave    10.254.117.213   <none>        6379/TCP   42s

#frontend(前端)
[root@node11 php_redis]# vim frontend-controller.yaml
apiVersion: v1
kind: ReplicationController
metadata:
name: frontend
labels:
name: frontend
spec:
replicas: 3
selector:
name: frontend
template:
metadata:
labels:
name: frontend
spec:
containers:

  • name: frontend
    image: 192.168.4.254:5000/guestbook-php-frontend
    env:
    • name: GET_HOSTS_FROM
      value: env
      ports:
      • containerPort: 80
      • [root@node11 php_redis]# kubectl create -f frontend-controller.yaml
        [root@node11 php_redis]# vim frontend-service.yaml
        apiVersion: v1
        kind: Service
        metadata:
        name: frontend
        labels:
        name: frontend
        spec:
        type: NodePort
        ports:

        • port: 80
          nodePort: 30001
          selector:
          name: frontend
          [root@node11 php_redis]# kubectl create -f frontend-service.yaml  
          [root@node11 php_redis]# kubectl get rc
          NAME           DESIRED   CURRENT   READY     AGE
          frontend       3         3         3         2m
          redis-master   1         1         1         14m
          redis-slave    2         2         2         6m
          [root@node11 php_redis]# kubectl get pod
          NAME                 READY     STATUS    RESTARTS   AGE
          frontend-3dqhv       1/1       Running   0          2m
          frontend-ct7qw       1/1       Running   0          2m
          frontend-tz3p4       1/1       Running   0          2m
          redis-master-cn208   1/1       Running   0          14m
          redis-slave-dctvw    1/1       Running   0          6m
          redis-slave-gxtfs    1/1       Running   0          6m
          [root@node11 php_redis]# kubectl get service
          NAME           CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
          frontend       10.254.210.184   <nodes>       80:30001/TCP   42s
          kubernetes     10.254.0.1       <none>        443/TCP        9h
          redis-master   10.254.174.239   <none>        6379/TCP       13m
          redis-slave    10.254.117.213   <none>        6379/TCP       5m

浏览器访问http://192.168.4.11:30001/,测试redis主从读写分离

以上就是k8s基础知识的详细内容了,看完之后是否有所收获呢?如果想了解更多相关内容,欢迎关注创新互联网站制作公司行业资讯!

网站栏目:k8s基础知识介绍-创新互联
链接地址:https://www.cdcxhl.com/article12/cciodc.html

成都网站建设公司_创新互联,为您提供动态网站网站营销自适应网站品牌网站制作搜索引擎优化网页设计公司

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

成都定制网站网页设计