K8S-day01

2. Kubernetes概述

官网:
https://kubernetes.io/
https://github.com/kubernetes/kubernetes

kubernetes是一种开源的容器编排工具,通过调度系统维持用户预期数量和状态的容器正常运行。
kubernetes提供的功能:
• 服务发现和负载均衡:Kubernetes 可以使用 DNS 名称或自己的 IP 地址公开容器,如果到容器的流量很大,Kubernetes 可以负载均衡并分配网络流量,从而使部署稳定。
• 存储编排
Kubernetes 允许您自动挂载您选择的存储系统,例如本地存储、公共云提供商等
• 自动部署和回滚
您可以使用 Kubernetes 描述已部署容器的所需状态,它可以以受控的速率将实际状态更改为所需状态。例如,您可以自动化 Kubernetes 来为您的部署创建新容器,删除现有容器并将它们的所有资源用于新容器。
• 自我修复
Kubernetes 重新启动失败的容器、替换容器、杀死不响应用户定义的运行状况检查的容器,并且在准备好服务之前不将其通告给客户端。
• 密钥与配置管理
Kubernetes 允许您存储和管理敏感信息,例如密码、OAuth 令牌和 ssh 密钥。您可以在不重建容器镜像的情况下部署和更新密钥和应用程序配置,也无需在堆栈配置中暴露密钥。

3. Kubernetes四组基本概念

1. Pod  Pod控制器
2. Name Namespace
3. Label  Label选择器
4. Service Ingress

#Pod:K8S里面能被运行的最小逻辑单元(原子单元)
    1个Pod里面可以运行多个容器, 他们共享了UTS NET IPC名称空间 
    边车() 模式  SideCar  

#Pod控制器:是Pod启动的一种模板   
    Deployment       
    DaemonSet      
    ReplicaSet 
    StatefulSet 
    Job
    Cronjob

#Name:
    资源apiVersion  类别Kind  元数据metadata  定义清单spec  状态status
    名称一般在元数据中

#Namespace: 名称空间
    相互隔离,使资源互不影响
    K8S内部的虚拟集群组 
    默认的名称空间: default   kube-system  kube-pulic

#Label:标签 
    主要用来分类管理资源对象,一个标签可以对应多个资源,一个资源也可以有多个标签,是多对多的关系.
    一个资源拥有多个标签可以实现不同维度的管理
    标签的组成就是 key=value
    于标签类似的就是注解其实就是注释

#Label选择器:
    资源打上标签之后,可以通过标签选择器来过滤你指定的标签,目前有两个,一个是基于等值和集合
    使用基于等值的选择器时,选择器的所有键值和其他资源对象的label键值完全相同(包括数量,key和value),才能匹配。
    而使用基于集合的label选择器,只要选择器部分键值匹配其他资源对象的label,就算匹配。选择器可以由一个以上条件(KV键值)组成,在多个条件的情况下,所有条件都必须满足
    matchlabels 
    matchExpressions

#Service:
    对外的访问接口    只能L4流量调度(只能基于4层进行对外访问主要是 IP  PORT)  
    kubernetes抽象出来一个概念,可以理解为负载均衡器,后端接pod

#Ingress:
    工作在OSI第七层的应用  对集群外部暴露集群内部service的一种方式

4. Kuberneter核心组件

1. 配置存储中心   etcd服务  
     etcd 是兼具一致性和高可用性的键值数据库,可以作为保存 Kubernetes 所有集群数据的后台数据库。在二进制部署etcd集群的时候,必须要考虑到高可用方案,一般部署三个或者三个以上的奇数个节点,因为当master宕机时,是通过选举制度来选择master的。

2. 主控节点master  
    master和node是两个逻辑上节点,当服务器资源充足时,可以将其分开在不同的机器上部署,当服务器资源不足时,也可以放到同一台机器上部署。master节点在部署的时候必须要考虑高可用方案,至少部署两个master。主控节点上主要是以下服务
    #kube-apiserver服务
    主节点上负责提供 Kubernetes API 服务的组件;它是 Kubernetes 控制面的前端。是整个集群中资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制。
apiserver提供了集群管理的restful api接口(鉴权、数据校验、集群变更等),负责和其它模块之间进行数据交互,承担了通信枢纽功能。
通过kubectl操作集群资源时需要登陆到master节点之上,而跨主机调用apiserver时,直接通过master前端的负载均衡来实现,详细可以参考:https://www.yuque.com/duduniao/ww8pmw/tr3hch#ziHTp

    #kube-controller-manager服务    
    controller manager 译为“控制器管理器”,k8s内部有很多资源控制器,比如:Node Controller、Replication Controller、Deployment Controller、Job Controller、Endpoints Controller等等,为了降低复杂度,将这些控制切都编译成了一个可执行文件,并且在同一个进程中运行。
controller manager 负责维护集群的状态,比如故障检测、自动扩展、滚动更新等。

    #kube-scheduler服务      
    调度器组件监视那些新创建的未指定运行节点的 Pod,并选择节点让 Pod 在上面运行。调度决策考虑的因素包括单个 Pod 和 Pod 集合的资源需求、硬件/软件/策略约束、亲和性和反亲和性规范、数据位置、工作负载间的干扰和最后时限。
当前各个node节点资源会通过kubelet汇总到etcd中,当用户提交创建pod请求时,apiserver将请求交给controller manager处理,controller manager通知scheduler进行筛选合适的node。此时scheduler通过etcd中存储的node信息进行预选(predict),将符合要求的node选出来。再根据优选(priorities)策略,选择最合适的node用于创建pod。


3. 运算节点(node)节点
   在Kubernetes集群的服务节点上,主要运行以下进程:Doker,kubelet和kube-proxy    

   #kubelet服务:
    主要功能:就是定时的从某个地方获取节点上pod的期望状态(运行什么容器 运行的数量 网路  存储)并调用对应的容器平台接口达到这个状态  定时汇报当前节点的状态给apiserver 镜像和容器的清理工作  保证镜像不会占用太多磁盘空间, 容器不会占用太多资源 

   #Kube-proxy服务
    podip   clusterip
    建立了pod网路和集群网络的关系      
    流量调度方式  
        1. Userspace  废弃    
        2. IPtable    频临废弃    
        3. IPs 推荐    

4. CLI客户端
    kubectl命令行工具

5.核心附件
    1. CNI网络插件 flannel /calico
    Kubernetes设计了网络模型,但是却将具体实现方式交给了网络插件来实现,CNI网络插件实现的是pod之间跨宿主机进行通信。默认情况下安装好node节点后,无法跨node进行宿主机通信可以参考(https://www.yuque.com/duduniao/ww8pmw/tr3hch#GtBRc) CNI网络插件有很多,比如:Flannel、Calico、Canal、Contiv、OpenContrail等,其中最常用的是Flannel和Calico两种。Flannel在node节点比较少,不夸网段时性能比较好,也是市场占有率最高的网络插件。

    2. 服务发现插件  coredns    
    在k8s集群中pod的IP地址会发生变化,k8s通过标签选择器筛选出一组pod,这组pod共同指关联到抽象资源service,这个service拥有固定的IP地址,即cluster ip。此时无论后端的pod如何变化,都可以请求都可以通过service到达后端的pod上。 每个service有着自己的名称和cluster IP地址,可以通过IP地址直接访问到service后端对应的pod资源,也可以使用DNS将cluster ip 和 service 名称关联,实现通过service的名称访问后端pod。kubernetes的dns插件有kube-dns和coredns两种,在kubernetes 1.11 开始使用coredns较多,在此之前使用kube-dns比较多。
使用dns解析时,如果在pod外,需要使用全域名解析如:nginx-web.default.svc.cluster.local,pod内部则可以使用短域名。

    3. 服务暴露插件  traefik
    service是将一组pod管理起来,提供了一个cluster ip和service name的统一访问入口,屏蔽了pod的ip变化。
ingress 是一种基于七层的流量转发策略,即将符合条件的域名或者location流量转发到特定的service上,而ingress仅仅是一种规则,k8s内部并没有自带代理程序完成这种规则转发。ingress-controller 是一个代理服务器,将ingress的规则能真正实现的方式,常用的有 nginx,traefik,haproxy。但是在k8s集群中,建议使用traefik,性能比haroxy强大,更新配置不需要重载服务,是首选的ingress-controller。

    4. GUI管理插件  Dashboard
       Dashboard是管理Kubernetes集群一个WEB GUI插件,可以再浏览器中实现资源配置和查看。可参考:https://www.yuque.com/duduniao/ww8pmw/myrwhq#aZGMp

5. Kubernetes三条网络

#节点网络IP:宿主机,搭建k8s,docker的网络(物理机,云主机的ip)
    10.0.0.0/24     两台     21   22
    172.17.0.0/24   

#pod网络:容器网络
    172.0.21.0/24
    172.0.22.0/24  
    172.0.0.0/16(大网络使各个容器网路之前实现通信)

#Service网络:
    192.168.0.0/16

6. Kubernetes架构

在这里插入图片描述

7. Kubernetes安装方式

#k8s安装方式:
    1. minikube  单节点微型k8s   简单的学习和预览使用  
    2. 二进制安装方式 (生产首选,  新手推荐)
    3. 使用kubeadmin进行部署,K8s的部署工具,   相对简单  熟手推荐  

#安装前的环境准备:
    1. 5台虚拟机    3台  2c 2G 50G    2台  4G内存    使用10.0.0.0/24网络
    2. 安装centos-7.6系统   做好基础优化    
    3. 安装部署bind9  部署自建的DNS系统  
    4. 安装部署Docker环境   部署Harbor私有仓库  

#实现一整套K8S生产环境的搭建    并实战的交付一套dubbo微服务   
    持续集成        
#使用二进制安装K8S:
     基础环境准备好 
         7.6   内核  3.8以上          
         关闭防火墙和selinux        
         时间同步           
         更新yum源         
         内核优化   内核转发    文件描述符大小          

     安装部署好bind9  内网DNS系统    
     安装部署Docker的私有仓库Harbor     
     准备证书,签发证书 cfssl    
     安装部署主节点服务4个    
         Etcd        
         Apiserver        
         COntroller-manager        
         Scheduler  

    安装部署运算节点2个
         Kubelet    
         kube-proxy

     关于cfssl证书工具:
        cfssl: 证书签发的主要工具        
        cfssl-json: 将cfssl生成的证书(json)格式变为承载式证书         
        cfssl-certinfo: 验证证书的信息 

    关于kubeconfig文件:   
        是一个k8s用户的配置文件       
        存放的是证书的信息       
        证书过期或者更换,需要同步替换该文件


 主机名:                  角色                          IP
 gcc-11                k8s代理节点1            10.0.0.11

 gcc-12                k8s代理节点2            10.0.0.12

 gcc-21                k8s运算节点1            10.0.0.21

 gcc-22                 k8s运算节点2            10.0.0.22

 gcc-200                k8s运维节点                10.0.0.200

8. Bind9安装部署

#在calc7-11主机上  
[root@gcc-11 ~]$  yum install  bind  bind-utils.x86_64 32:9.11.4-16.P2.el7_8.6  -y 
[root@gcc-11 ~]$  vim /etc/named.conf
options {
        #此处写本机地址
        listen-on port 53 { 10.0.0.11; };
        directory       "/var/named";
        dump-file       "/var/named/data/cache_dump.db";
        statistics-file "/var/named/data/named_stats.txt";
        memstatistics-file "/var/named/data/named_mem_stats.txt";
        recursing-file  "/var/named/data/named.recursing";
        secroots-file   "/var/named/data/named.secroots";
        allow-query     { any; };
        #下面写的是网关地址
        forwarders      { 10.0.0.2; }; 
........

        dnssec-enable no;
        dnssec-validation no;

#检查语法 
[root@gcc-11 ~]$  named-checkconf

#编辑区域配置文件
[root@gcc-11 ~]$  vim /etc/named.rfc1912.zones
#在文件末尾添加如下内容(注意更改成本机ip)
zone "host.com" IN {
        type  master;
        file  "host.com.zone";
        allow-update { 10.0.0.11; };
};
zone "od.com" IN {
        type  master;
        file  "od.com.zone";
        allow-update { 10.0.0.11; };
};



#配置host区域zone(注意主机名和ip地址需要修改)
[root@gcc-11 ~]$ vim /var/named/host.com.zone 
$ORIGIN host.com.
$TTL 600    ; 10 minutes
@       IN SOA    dns.host.com. dnsadmin.host.com. (
                2020060401 ; serial
                10800      ; refresh (3 hours)
                900        ; retry (15 minutes)
                604800     ; expire (1 week)
                86400      ; minimum (1 day)
                )
            NS   dns.host.com.
$TTL 60    ; 1 minute
#下面只要改ip,在下面主机名和ip都要改
dns                A    10.0.0.11
#主机名                   ip地址
gcc-11           A    10.0.0.11
gcc-12           A    10.0.0.12
gcc-21           A    10.0.0.21
gcc-22           A    10.0.0.22
gcc-200          A    10.0.0.200



#配置od区域的zone(dns行改成本机地址)
[root@gcc-11 ~]$  vim  /var/named/od.com.zone   
$ORIGIN od.com.
$TTL 600    ; 10 minutes
@           IN SOA    dns.od.com. dnsadmin.od.com. (
                2019060401 ; serial
                10800      ; refresh (3 hours)
                900        ; retry (15 minutes)
                604800     ; expire (1 week)
                86400      ; minimum (1 day)
                )
                NS   dns.od.com.
$TTL 60    ; 1 minute
dns                A    10.0.0.11



#检查语法(没有任何反馈则是正确)
[root@gcc-11 ~]$  named-checkconf 

[root@gcc-11 ~]$  systemctl restart named
                    systemctl enable  named

[root@gcc-11 ~]$  netstat -lntp | grep 53
tcp        0      0 10.0.0.11:53            0.0.0.0:*               LISTEN      7089/named         
tcp        0      0 127.0.0.1:953           0.0.0.0:*               LISTEN      7089/named         
tcp6       0      0 ::1:953                 :::*                    LISTEN      7089/named  

#更改主机名进行每台测试
[root@gcc-11 ~]$  dig -t A gcc-11.host.com @10.0.0.11  +short
10.0.0.11
[root@gcc-11 ~]$  dig -t A gcc-200.host.com @10.0.0.11  +short
10.0.0.200
[root@gcc-11 ~]$  dig -t A gcc-21.host.com @10.0.0.11  +short
10.0.0.21
[root@gcc-11 ~]$  dig -t A gcc-12.host.com @10.0.0.11  +short
10.0.0.12


#所有主机操作(将所有的主机dns地址改为dns的地址)
[root@gcc-11 ~]$  vim /etc/sysconfig/network-scripts/ifcfg-ens32
DNS1=10.0.0.11

#此步骤在重启网卡后在进行设置(在之前设置会失效)(所有主机都操作)
[root@gcc-11 ~]$  cat /etc/resolv.conf        #重启网卡失效
search  host.com
nameserver 10.0.0.11

#如果有需要将宿主机的vm8网卡dns也改为自主创建的dnsIP地址

9. 准备签发证书

#证书签发工具  cfssl
################################在运维主机  gcc-200  

[root@gcc-200 ~]$  wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 -O /usr/bin/cfssl
[root@gcc-200 ~]$  wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 -O /usr/bin/cfssl-json
[root@gcc-200 ~]$  wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 -O /usr/bin/cfssl-certinfo

[root@gcc-200 ~]$  ll /usr/bin/cfssl*
-rwxr-xr-x 1 root root 10376657 Mar 30  2016 /usr/bin/cfssl
-rwxr-xr-x 1 root root  6595195 Mar 30  2016 /usr/bin/cfssl-certinfo
-rwxr-xr-x 1 root root  2277873 Mar 30  2016 /usr/bin/cfssl-json

#给三个文件添加执行权限必须
[root@gcc-200 ~]$  chmod +x /usr/bin/cfssl*

#自签证书 
[root@gcc-200 ~]$  mkdir -p /opt/certs
[root@gcc-200 /opt/certs]$  vim /opt/certs/ca-csr.json
{
    "CN": "oldboyEdu",
    "hosts": [
    ],
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "ST": "shanghai",
            "L": "shanghai",
            "O": "od",
            "OU": "ops"
        }
    ],
    "ca": {
        "expiry": "175200h"
    }
}
#CN: common name 浏览器使用该字段验证网站是否合法,一般写的是域名,非常重要

#创建证书 
#注意切换到证书目录下执行
[root@gcc-200 ~]$  cd  /opt/certs
[root@gcc-200 /opt/certs]$  cfssl gencert  -initca ca-csr.json   | cfssl-json  -bare ca
2020/06/04 15:57:28 [INFO] generating a new CA key and certificate from CSR
2020/06/04 15:57:28 [INFO] generate received request
2020/06/04 15:57:28 [INFO] received CSR
2020/06/04 15:57:28 [INFO] generating key: rsa-2048
2020/06/04 15:57:28 [INFO] encoded CSR
2020/06/04 15:57:28 [INFO] signed certificate with serial number 85131540293224189869700802768351737191462236955
[root@gcc-200 /opt/certs]$  ll
total 16
-rw-r--r-- 1 root root  330 Jun  4 15:54 ca-csr.json
-rw------- 1 root root 1679 Jun  4 15:57 ca-key.pem
-rw-r--r-- 1 root root  997 Jun  4 15:57 ca.csr
-rw-r--r-- 1 root root 1350 Jun  4 15:57 ca.pem

10. 准备Docker环境

# 21 22 200上面安装docker
#分别在运维,运算机器上面执行
[root@gcc-200 /opt/certs]$  curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
[root@gcc-200 /opt/certs]$  mkdir -p /data/docker
[root@gcc-200 /opt/certs]$  systemctl  start docker
[root@gcc-200 /opt/certs]$  systemctl  enable docker
[root@gcc-200 /opt/certs]$  vim /etc/docker/daemon.json
{
  "graph": "/data/docker",
  "storage-driver": "overlay2",
  "insecure-registries": ["registry.access.redhat.com","quay.io","harbor.od.com"],
  "registry-mirrors": ["https://q2gr04ke.mirror.aliyuncs.com"],
  "bip": "172.x.x.1/24",
  #注意此处xx为主机ip地址的后两位
  "exec-opts": ["native.cgroupdriver=systemd"],
  "live-restore": true
}
[root@gcc-200 /opt/certs]$  systemctl  restart docker
Copyright © 高程程 all right reserved,powered by Gitbook修订于: 2021-05-18 21:14:48

results matching ""

    No results matching ""