zoukankan      html  css  js  c++  java
  • 搭建一套企业级高可用Kubernetes/K8s集群

     

     

     

     

     

     

     自签证书

     k8s集群由两套证书:1、etcd集群内部通信的证书;2、访问apiserver需要的证书

     etcd推荐使用cfssl工具来生成证书进行验证

    https://my.oschina.net/u/4342638/blog/3608300

    etcd集群master节点安装 1,自签名SSL证书 ##安装工具cfssl $ cat cfssl.sh curl -L https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 -o /usr/local/bin/cfssl curl -L https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 -o /usr/local/bin/cfssljson curl -L https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 -o /usr/local/bin/cfssl-certinfochmod +x /usr/local/bin/cfssl /usr/local/bin/cfssljson /usr/local/bin/cfssl-certinfo

    ##自签名证书脚本详解 root@k8s-master: ~/k8s/etcd-cert 16:56:21 $ cat etcd-cert.sh #ca办法证书机构 cat > ca-config.json <<EOF { "signing": { "default": { "expiry": "87600h" #证书过期时间h单位 }, "profiles": { "www": { "expiry": "87600h", "usages": [ "signing", "key encipherment", "server auth", "client auth" ] } } } } EOF #ca机构请求

    cat > ca-csr.json <<EOF { "CN": "etcd CA", "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "L": "Beijing", "ST": "Beijing" } ] } EOF #生成证书:读取上边两个文件生成证书

    cfssl gencert -initca ca-csr.json | cfssljson -bare ca - #----------------------- #etcd域名证书,需要把etcd节点ip都写进去,多写点备份用 cat > server-csr.json <<EOF { "CN": "etcd", "hosts": [ "192.168.1.63", "192.168.1.65", "192.168.1.66" ], "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "L": "BeiJing", "ST": "BeiJing" } ] } EOF

    cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=www server-csr.json | cfssljson -bare server

     

     上面这四个证书需要使用到

    https://blog.frognew.com/2017/04/install-etcd-cluster.html

    TLS密钥和证书

    这里部署的etcd集群使用TLS证书对证书通信进行加密,并开启基于CA根证书签名的双向数字证书认证。

    下面介绍使用cfssl生成所需要的私钥和证书.

    安装cfssl

    cfssl是使用Go语言开发的工具,如果系统中安装了Go,可以使用直接go get安装cfssl:

    go get -u github.com/cloudflare/cfssl/cmd/...

    会在$GOPATH/bin下安装cfssl, cfssjosn, mkbundle等工具。

    CA证书和私钥

    创建ca-config.json:

    {
      "signing": {
        "default": {
          "expiry": "87600h"
        },
        "profiles": {
          "frognew": {
            "usages": [
                "signing",
                "key encipherment",
                "server auth",
                "client auth"
            ],
            "expiry": "87600h"
          }
        }
      }
    }

    ca-config.json中可以定义多个profile,分别设置不同的expiry和usages等参数。如上面的ca-config.json中定义了名称为frognew的profile,这个profile的expiry 87600h为10年,useages中:

    • signing表示此CA证书可以用于签名其他证书,ca.pem中的CA=TRUE
    • server auth表示TLS Server Authentication
    • client auth表示TLS Client Authentication

    创建CA证书签名请求配置ca-csr.json:

    {
      "CN": "frognew",
      "key": {
        "algo": "rsa",
        "size": 2048
      },
      "names": [
        {
          "C": "CN",
          "ST": "BeiJing",
          "L": "BeiJing",
          "O": "frognew",
          "OU": "cloudnative"
        }
      ]
    }
    下面使用cfss生成CA证书和私钥:
    cfssl gencert -initca ca-csr.json | cfssljson -bare ca
    
    1
    2
    
    ls
    ca-config.json  ca.csr  ca-csr.json  ca-key.pem  ca.pem
    

    ca-key.pem和ca.pem需要保存在一个安全的地方,后边会用到。

    etcd证书和私钥

    创建etcd证书签名请求配置etcd-csr.json:

    {
        "CN": "frognew",
        "hosts": [
          "127.0.0.1",
          "192.168.61.11",
          "192.168.61.12",
          "192.168.61.13",
          "node1",
          "node2",
          "node3"
        ],
        "key": {
            "algo": "rsa",
            "size": 2048
        },
        "names": [
            {
                "C": "CN",
                "ST": "BeiJing",
                "L": "BeiJing",
                "O": "frognew",
                "OU": "cloudnative"
            }
        ]
    }
    

    注意上面配置hosts字段中制定授权使用该证书的IP和域名列表,因为现在要生成的证书需要被etcd集群各个节点使用,所以这里指定了各个节点的IP和hostname。

    下面生成etcd的证书和私钥:

    1
    2
    3
    4
    
    cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=frognew etcd-csr.json | cfssljson -bare etcd
    
    ls etcd*
    etcd.csr  etcd-csr.json  etcd-key.pem  etcd.pem
    

    对生成的证书可以使用cfssl或openssl查看:

    1
    2
    3
    
    cfssl-certinfo -cert etcd.pem
    
    openssl x509  -noout -text -in  etcd.pem

    https://589e.com/category/building-etcd-cluster.html

    介绍

    etcd 是一个分布式一致性 K-V 存储系统,可用于服务注册发现与共享配置,具有以下优点:

    1. 简单:相比于晦涩难懂的 Paxos 算法,etcd 基于相对简单且易实现的 Raft 算法实现一致性,并通过 gRPC 提供接口调用
    2. 安全:支持 TLS 通信,并可以针对不同的用户进行对 key 的读写控制
    3. 高性能:10,000/秒的写性能

     

    一、环境准备

    1.1 机器信息

    主机名IP系统
    node1 172.29.150.202 Centos 7.2
    node2 172.29.150.203 Centos 7.2
    node3 172.29.150.204 Centos 7.2

    1.2 关闭防火墙及 SELinux

    systemctl stop iptables
    systemctl stop firewalld
    systemctl disable iptables
    systemctl disable firewalld
    vi /etc/selinux/config
    SELINUX=disable
    

    1.3 设置 hosts

    vim /etc/hosts
    172.29.150.202 node1
    172.29.150.203 node2
    172.29.150.204 node3
    

    1.4 创建用户

    useradd etcd -d /opt/platform/etcd -c "Etcd user" -r -s /sbin/nologin

    1.4 创建用户

    useradd etcd -d /opt/platform/etcd -c "Etcd user" -r -s /sbin/nologin
    

    二、创建验证

    2.1 安装 CFSSL

    wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
    wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
    chmod +x cfssl_linux-amd64 cfssljson_linux-amd64
    mv cfssl_linux-amd64 /usr/local/bin/cfssl
    mv cfssljson_linux-amd64 /usr/local/bin/cfssljson
    

    2.2 创建 CA 证书配置,生成 CA 证书和私钥

    先用 cfssl 命令生成包含默认配置的 config.json 和 csr.json 文件

    mkdir /opt/ssl
    cd /opt/ssl
    cfssl print-defaults config > config.json
    cfssl print-defaults csr > csr.json
    

    然后分别修改这两个文件为如下内容

    config.json

    {
      "signing": {
        "default": {
          "expiry": "87600h"
        },
        "profiles": {
          "kubernetes": {
            "usages": [
                "signing",
                "key encipherment",
                "server auth",
                "client auth"
            ],
            "expiry": "87600h"
          }
        }
      }
    }
    ca-config.json:
    可以定义多个 profiles,分别指定不同的过期时间、使用场景等参数;后续在签名证书时使用某个 profile;
    signing:
    表示该证书可用于签名其它证书;生成的 ca.pem 证书中 CA=TRUE;
    server auth:
    表示 Client 可以用该 CA 对 Server 提供的证书进行验证;
    client auth:
    表示 Server 可以用该 CA 对 Client 提供的证书进行验证;

    csr.json

    {
      "CN": "kubernetes",
      "key": {
        "algo": "rsa",
        "size": 2048
      },
      "names": [
        {
          "C": "CN",
          "ST": "Wuhan",
          "L": "Hubei",
          "O": "k8s",
          "OU": "System"
        }
      ]
    }
    
    CN:
    Common Name,kube-apiserver 从证书中提取该字段作为请求的用户名(User Name);浏览器使用该字段验证网站是否合法;
    O:
    Organization,kube-apiserver 从证书中提取该字段作为请求用户所属的组(Group);

    生成 CA 证书和私钥

    cd /opt/ssl
    cfssl gencert -initca csr.json | cfssljson -bare ca
    

    CA 有关证书列表如下:

    [root@k8s-console ssl]# tree
    ├── ca.csr
    ├── ca-key.pem
    ├── ca.pem
    ├── config.json
    └── csr.json
    

    2.3 创建 etcd 证书配置,生成 etcd 证书和私钥

    在 /opt/ssl 下添加文件 etcd-csr.json,内容如下

    {
      "CN": "etcd",
      "hosts": [
        "127.0.0.1",
        "172.29.150.202",
        "172.29.150.203",
        "172.29.150.204"
      ],
      "key": {
        "algo": "rsa",
        "size": 2048
      },
      "names": [
        {
          "C": "CN",
          "ST": "Shanghai",
          "L": "Shanghai",
          "O": "etcd",
          "OU": "Etcd Security"
        }
      ]
    }
    

    生成 etcd 证书和密钥

    cd /opt/ssl
    cfssl gencert -ca=/opt/ssl/ca.pem 
    -ca-key=/opt/ssl/ca-key.pem 
    -config=/opt/ssl/config.json 
    -profile=kubernetes etcd-csr.json | cfssljson -bare etcd

    etcd 有关证书证书列表如下

    ls etcd*
    etcd.csr  etcd-csr.json  etcd-key.pem  etcd.pem
    

    2.4 证书分发

    for IP in `seq 202 204`;do
        scp scp ca*.pem etcd*.pem root@172.29.150.$IP:/opt/ssl
    done
    

    给证书读权限

    chmod 644 /opt/ssl/*

    三、安装 etcd

    3.1 在三台上都安装 etcd

    tar -xvf etcd-v3.3.4-linux-amd64.tar.gz
    cd etcd-v3.3.4-linux-amd64
    cp mv etcd* /opt/platform/etcd/
    cd ..
    rm -rf etcd-v3.3.4-linux-amd64

    三、安装 etcd

    3.1 在三台上都安装 etcd

    tar -xvf etcd-v3.3.4-linux-amd64.tar.gz
    cd etcd-v3.3.4-linux-amd64
    cp mv etcd* /opt/platform/etcd/
    cd ..
    rm -rf etcd-v3.3.4-linux-amd64
    

    3.2 添加 etcd 配置

    注意:不同机器的配置不一样 ETCD_NAMEETCD_ADVERTISE_CLIENT_URLSETCD_INITIAL_ADVERTISE_PEER_URLS

    vim /opt/platform/etcd/etcd.conf
    
    # [member]
    ETCD_NAME=etcd1
    ETCD_DATA_DIR=/opt/platform/etcd/data
    ETCD_LISTEN_PEER_URLS=https://0.0.0.0:2380
    ETCD_LISTEN_CLIENT_URLS=https://0.0.0.0:2379
    
    # [cluster]
    ETCD_ADVERTISE_CLIENT_URLS=https://172.29.150.202:2379
    ETCD_INITIAL_ADVERTISE_PEER_URLS=https://172.29.150.202:2380
    ETCD_INITIAL_CLUSTER="etcd1=https://172.29.150.202:2380,etcd2=https://172.29.150.203:2380,etcd3=https://172.29.150.204:2380"
    ETCD_INITIAL_CLUSTER_STATE=new
    ETCD_INITIAL_CLUSTER_TOKEN=etcd-cluster
    
    # [security]
    ETCD_CERT_FILE="/opt/ssl/etcd.pem"
    ETCD_KEY_FILE="/opt/ssl/etcd-key.pem"
    ETCD_CLIENT_CERT_AUTH="true"
    ETCD_TRUSTED_CA_FILE="/opt/ssl/ca.pem"
    ETCD_AUTO_TLS="true"
    ETCD_PEER_CERT_FILE="/opt/ssl/etcd.pem"
    ETCD_PEER_KEY_FILE="/opt/ssl/etcd-key.pem"
    ETCD_PEER_CLIENT_CERT_AUTH="true"
    ETCD_PEER_TRUSTED_CA_FILE="/opt/ssl/ca.pem"
    ETCD_PEER_AUTO_TLS="true"
    

    配置说明

    ETCD_NAME:
    etcd 集群中的节点名,这里可以随意,可区分且不重复就行。
    ETCD_LISTEN_PEER_URLS:
    监听的用于节点之间通信的 URL,可监听多个,集群内部将通过这些 URL 进行数据交互(如选举、数据同步等)。
    ETCD_LISTEN_CLIENT_URLS:
    监听的用于客户端通信的 URL,同样可以监听多个。
    ETCD_ADVERTISE_CLIENT_URLS:
    建议使用的客户端通信 URL,该值用于 etcd 代理或 etcd 成员与 etcd 节点通信。
    ETCD_INITIAL_ADVERTISE_PEER_URLS:
    建议用于节点之间通信的 URL,节点间将以该值进行通信。
    ETCD_INITIAL_CLUSTER:
    也就是集群中所有的 initial--advertise-peer-urls 的合集。
    ETCD_INITIAL_CLUSTER_STATE:
    新建集群的标志。
    ETCD_INITIAL_CLUSTER_TOKEN:
    节点的 token 值,设置该值后集群将生成唯一 ID,并为每个节点也生成唯一 ID,当使用相同配置文件再启动一个集群时,只要该 token 值不一样,etcd 集群就不会相互影响。

    3.3 添加系统服务

    vim /usr/lib/systemd/system/etcd.service
    
    [Unit]
    Description=Etcd Service
    After=network.target
    
    [Service]
    Environment=ETCD_DATA_DIR
    EnvironmentFile=-/opt/platform/etcd/etcd.conf
    Type=notify
    User=etcd
    WorkingDirectory=/opt/platform/etcd
    PermissionsStartOnly=true
    ExecStart=/usr/bin/etcd
    Restart=on-failure
    RestartSec=10 LimitNOFILE=65536 [Install] WantedBy=multi-user.target

    3.4 创建 data 目录,然后启动 etcd 服务

    mkdir -p /opt/platform/etcd/data && chown etcd:etcd -R /opt/platform/etcd
    systemctl enable etcd.service && systemctl start etcd.service
    

    四、验证 etcd 集群状态

    查看 etcd 集群状态

    etcdctl 
      --endpoints=https://172.29.150.202:2379 
      --cert-file=/opt/ssl/etcd.pem 
      --ca-file=/opt/ssl/ca.pem 
      --key-file=/opt/ssl/etcd-key.pem 
      cluster-health
    
    member 35b8f6acff2c4453 is healthy: got healthy result from https://172.29.150.202:2379
    member 718a387d5439a839 is healthy: got healthy result from https://172.29.150.203:2379
    member 75b9609afd556afb is healthy: got healthy result from https://172.29.150.204:2379
    cluster is healthy
    

    查看 etcd 集群成员

    etcdctl 
      --endpoints=https://172.29.150.202:2379 
      --cert-file=/opt/ssl/etcd.pem 
      --ca-file=/opt/ssl/ca.pem 
      --key-file=/opt/ssl/etcd-key.pem 
      member list
    
    35b8f6acff2c4453: name=etcd1 peerURLs=https://172.29.150.202:2380 clientURLs=https://172.29.150.202:2379 isLeader=true
    718a387d5439a839: name=etcd2 peerURLs=https://172.29.150.203:2380 clientURLs=https://172.29.150.203:2379 isLeader=false
    75b9609afd556afb: name=etcd3 peerURLs=https://172.29.150.204:2380 clientURLs=https://172.29.150.204:2379 

    环境信息

    CentOS 7.3

    1
    2
    3
    
    192.168.61.11 node1
    192.168.61.12 node2
    192.168.61.13 node3

     ectd集群采用 3 5 7 9奇数

    ETCD 是一个高可用的分布式键值数据库,可用于服务发现。ETCD 采用 raft 一致性算法,基于 Go 语言实现。etcd作为一个高可用键值存储系统,天生就是为集群化而设计的。由于Raft算法在做决策时需要多数节点的投票,所以etcd一般部署集群推荐奇数个节点,推荐的数量为3、5或者7个节点构成一个集群。

    Etcd 是 CoreOS 基于 Raft 开发的分布式 key-value 存储,可用于服务发现、共享配置以及一致性保障(如数据库选主、分布式锁等)。

    kuberntes 系统使用 etcd 存储所有数据,是最重要的组件之一,注意 etcd集群只能有奇数个节点(1,3,5...),本文档使用3个节点做集群。

     我们在上面的master1 node1 node2上面的三台机器上面部署etcd集群

     https://www.jianshu.com/p/3189dd70a691

    etcd下载地址:https://github.com/coreos/etcd/releases

    安装之前三台机器需要设置hostname

     下载etcd介质之后解压如下

     解压之后存在两个文件夹一个etcd文件夹,一个是etcd.service文件夹

    接下来修改etcd的配置文件

    创建etcd配置文件etcd.conf,此配置文件是定义一些变量,方便etcd.service文件中直接引用、方便后期维护。

    配置文件的所有含义都在创建etcd.service配置文件后有详解。

    etcd 是一个高可用的 Key/Value 存储系统,主要用于分享配置和服务发现。etcd 的灵感来自于 ZooKeeper 和 Doozer,侧重于:

    简单:支持 curl 方式的用户 API (HTTP+JSON)

    安全:可选 SSL 客户端证书认证

    快速:单实例可达每秒 10000 次写操作

    可靠:使用 Raft 实现分布式

    ETCD下载

    https://github.com/etcd-io/etcd/releases 选择最新版本:etcd-v3.3.13-darwin-amd64.zip上传到服务器

    https://blog.frognew.com/2017/04/install-etcd-cluster.html

    etcd集群master节点安装 1,自签名SSL证书 ##安装工具cfssl $ cat cfssl.sh curl -L https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 -o /usr/local/bin/cfssl curl -L https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 -o /usr/local/bin/cfssljson curl -L https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 -o /usr/local/bin/cfssl-certinfochmod +x /usr/local/bin/cfssl /usr/local/bin/cfssljson /usr/local/bin/cfssl-certinfo ##自签名证书脚本详解 root@k8s-master: ~/k8s/etcd-cert 16:56:21 $ cat etcd-cert.sh #ca办法证书机构 cat > ca-config.json <<EOF { "signing": { "default": { "expiry": "87600h" #证书过期时间h单位 }, "profiles": { "www": { "expiry": "87600h", "usages": [ "signing", "key encipherment", "server auth", "client auth" ] } } } } EOF #ca机构请求 cat > ca-csr.json <<EOF { "CN": "etcd CA", "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "L": "Beijing", "ST": "Beijing" } ] } EOF #生成证书:读取上边两个文件生成证书 cfssl gencert -initca ca-csr.json | cfssljson -bare ca - #----------------------- #etcd域名证书,需要把etcd节点ip都写进去,多写点备份用 cat > server-csr.json <<EOF { "CN": "etcd", "hosts": [ "192.168.1.63", "192.168.1.65", "192.168.1.66" ], "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "L": "BeiJing", "ST": "BeiJing" } ] } EOF cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=www server-csr.json | cfssljson -bare server

    APIserver是整个集群的入口,只有它启动了,别的组件才可以启动;我们基于https访问,所以需要自签证书;

    1、创建CA配置json文件

    [root@k8s-master01 k8s]# cat ca-csr.json 
    {
        "CN": "kubernetes",
        "key": {
            "algo": "rsa",
            "size": 2048
        },
        "names": [
            {
                "C": "CN",
                "L": "HuBei",
                "ST": "WuHan",
                "O": "k8s",
                "OU": "System"
            }
        ]
    }
    
    [root@k8s-master01 k8s]# cat ca-config.json 
    {
      "signing": {
        "default": {
          "expiry": "876000h"
        },
        "profiles": {
          "kubernetes": {
             "expiry": "876000h",
             "usages": [
                "signing",
                "key encipherment",
                "server auth",
                "client auth"
            ]
          }
        }
      }
    }

    2、创建apiserver证书的所需配置文件

    [root@k8s-master01 k8s]# cat kube-proxy-csr.json
    {
    "CN": "system:kube-proxy",
    "hosts": [],
    "key": {
    "algo": "rsa",
    "size": 2048
    },
    "names": [
    {
    "C": "CN",
    "L": "HuBei",
    "ST": "WuHan",
    "O": "k8s",
    "OU": "System"
    }
    ]
    }


    [root@k8s-master01 k8s]# cat server-csr.json
    {
    "CN": "kubernetes",
    "hosts": [
    "10.0.0.1",
    "127.0.0.1",
    "kubernetes",
    "kubernetes.default",
    "kubernetes.default.svc",
    "kubernetes.default.svc.cluster",
    "kubernetes.default.svc.cluster.local",
    "10.16.8.150",
    "10.16.8.151",
    "10.16.8.156",
    "10.16.8.155",
    "10.16.8.164"
    ],
    "key": {
    "algo": "rsa",
    "size": 2048
    },
    "names": [
    {
    "C": "CN",
    "L": "HuBei",
    "ST": "WuHan",
    "O": "k8s",
    "OU": "System"
    }
    ]
    }

    注:host中的最后几个IP为需要连接apiserver的IP,一般为master集群的所有IP,和负载均衡LB的所有IP和VIP,本文中的IP
    "10.16.8.150", master01
    "10.16.8.151", master02
    "10.16.8.156", LB
    "10.16.8.155", 备用IP
    "10.16.8.164" 备用IP
    复制代码

    3、自建CA

    [root@k8s-master01 k8s]# cfssl gencert -initca ca-csr.json | cfssljson -bare ca -

    4、生成证书

    [root@k8s-master01 k8s]# cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes server-csr.json | cfssljson -bare server
    2019/11/04 16:59:08 [INFO] generate received request
    2019/11/04 16:59:08 [INFO] received CSR
    2019/11/04 16:59:08 [INFO] generating key: rsa-2048
    2019/11/04 16:59:09 [INFO] encoded CSR
    2019/11/04 16:59:09 [INFO] signed certificate with serial number 710468047565346200192196031945671979263159074343
    2019/11/04 16:59:09 [WARNING] This certificate lacks a "hosts" field. This makes it unsuitable for
    websites. For more information see the Baseline Requirements for the Issuance and Management
    of Publicly-Trusted Certificates, v.1.1.6, from the CA/Browser Forum (https://cabforum.org);
    specifically, section 10.2.3 ("Information Requirements").
    
    
    [root@k8s-master01 k8s]# cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kube-proxy-csr.json | cfssljson -bare kube-proxy
    2019/11/04 16:59:23 [INFO] generate received request
    2019/11/04 16:59:23 [INFO] received CSR
    2019/11/04 16:59:23 [INFO] generating key: rsa-2048
    2019/11/04 16:59:23 [INFO] encoded CSR
    2019/11/04 16:59:23 [INFO] signed certificate with serial number 632011921807538541174903390077695048984832013926
    2019/11/04 16:59:23 [WARNING] This certificate lacks a "hosts" field. This makes it unsuitable for
    websites. For more information see the Baseline Requirements for the Issuance and Management
    of Publicly-Trusted Certificates, v.1.1.6, from the CA/Browser Forum (https://cabforum.org);
    specifically, section 10.2.3 ("Information Requirements").

    注:host中的最后几个IP为需要连接apiserver的IP,一般为master集群的所有IP,和负载均衡LB的所有IP和VIP,本文中的IP

     

     

     

    kube-APIserver组件介绍
    kube-APIserver提供了k8s各类资源对象(pod,RC,Service等)的增删改查及watch等HTTP Rest接口,是整个系统的数据总线和数据中心。
    kube-APIserver的功能
    提供了集群管理的REST API接口(包括认证授权、数据校验以及集群状态变更)
    提供其他模块之间的数据交互和通信的枢纽(其他模块通过API Server查询或修改数据,只有API Server才直接操作etcd)
    是资源配额控制的入口
    拥有完备的集群安全机制
    kube-apiserver工作原理图

    kubernetes API的访问
    k8s通过kube-apiserver这个进程提供服务,该进程运行在单个k8s-master节点上。默认有两个端口
    本地端口
    该端口用于接收HTTP请求
    该端口默认值为8080,可以通过API Server的启动参数“--insecure-port”的值来修改默认值
    默认的IP地址为“localhost”,可以通过启动参数“--insecure-bind-address”的值来修改该IP地址
    非认证或授权的HTTP请求通过该端口访问API Server
    安全端口
    该端口默认值为6443,可通过启动参数“--secure-port”的值来修改默认值
    默认IP地址为非本地(Non-Localhost)网络端口,通过启动参数“--bind-address”设置该值
    该端口用于接收HTTPS请求
    用于基于Tocken文件或客户端证书及HTTP Base的认证
    用于基于策略的授权
    默认不启动HTTPS安全访问控制


    kube-controller-manager组件介绍
    kube-Controller Manager作为集群内部的管理控制中心,负责集群内的Node、Pod副本、服务端点(Endpoint)、命名空间(Namespace)、服务账号(ServiceAccount)、资源定额(ResourceQuota)的管理,当某个Node意外宕机时,Controller Manager会及时发现并执行自动化修复流程,确保集群始终处于预期的工作状态。
    kube-scheduler组件介绍
    kube-scheduler是以插件形式存在的组件,正因为以插件形式存在,所以其具有可扩展可定制的特性。kube-scheduler相当于整个集群的调度决策者,其通过预选和优选两个过程决定容器的最佳调度位置。
    kube-scheduler(调度器)的指责主要是为新创建的pod在集群中寻找最合适的node,并将pod调度到Node上
    从集群所有节点中,根据调度算法挑选出所有可以运行该pod的节点
    再根据调度算法从上述node节点选择最优节点作为最终结果
    Scheduler调度器运行在master节点,它的核心功能是监听apiserver来获取PodSpec.NodeName为空的pod,然后为pod创建一个binding指示pod应该调度到哪个节点上,调度结果写入apiserver
    kube-scheduler主要职责
    集群高可用:如果 kube-scheduler 设置了 leader-elect 选举启动参数,那么会通过 etcd 进行节点选主( kube-scheduler 和 kube-controller-manager 都使用了一主多从的高可用方案)
    调度资源监听:通过 list-Watch 机制监听 kube-apiserver 上资源的变化,这里的资源主要指的是 Pod 和 Node
    调度节点分配:通过预选(Predicates)与优选(Priorites)策略,为待调度的 Pod 分配一个 Node 进行绑定并填充nodeName,同时将分配结果通过 kube-apiserver 写入 etcd

     

     

    [root@master01 k8s-cert]# cd ..      //回到k8s工作目录
    [root@master01 k8s]# tar zxvf kubernetes-server-linux-amd64.tar.gz      //解压软件包
    kubernetes/
    kubernetes/server/
    kubernetes/server/bin/
    ...
    [root@master01 k8s]# cd kubernetes/server/bin/     //进入加压后软件命令存放目录
    [root@master01 bin]# ls
    apiextensions-apiserver              kube-apiserver.docker_tag           kube-proxy
    cloud-controller-manager             kube-apiserver.tar                  kube-proxy.docker_tag
    cloud-controller-manager.docker_tag  kube-controller-manager             kube-proxy.tar
    cloud-controller-manager.tar         kube-controller-manager.docker_tag  kube-scheduler
    hyperkube                            kube-controller-manager.tar         kube-scheduler.docker_tag
    kubeadm                              kubectl                             kube-scheduler.tar
    kube-apiserver                       kubelet                             mounter

     

     

     ssl文件夹下面存储上面之前生成的apiserver的证书

     cfg下面保存的是配置文件

     /opt/kubernetes是k8s安装的根目录

     kube-apiserver要配置访问etcd的证书

     

     

     

     https://www.gaoyaqiu.com/post/kubernetes/07/

    下载Server的二进制包
    配置和启动 kube-apiserver
    创建kube-apiserver配置文件
    创建kube-apiserver.service文件
    启动kube-apiserver
    配置和启动 kube-controller-manager
    创建 kube-controller-manager的serivce配置文件
    创建kube-controller-manager.service文件
    配置和启动 kube-scheduler
    创建 kube-scheduler配置文件
    启动kube-scheduler
    验证 master 节点各组件状态
    参考

    master节点需要部署三个组件:kube-apiserver、kube-controller-manager、kube-scheduler

    下载Server的二进制包

    [root@master01 ~]# wget https://dl.k8s.io/v1.11.3/kubernetes-server-linux-amd64.tar.gz
    [root@master01 ~]# mkdir master_pkg
    [root@master01 ~]# mv kubernetes-server-linux-amd64.tar.gz master_pkg/
    [root@master01 ~]# cd master_pkg
    [root@master01 master_pkg]# tar zxvf kubernetes-server-linux-amd64.tar.gz 
    kubernetes/
    kubernetes/LICENSES
    kubernetes/server/
    kubernetes/server/bin/
    kubernetes/server/bin/kube-scheduler.tar
    kubernetes/server/bin/kube-scheduler.docker_tag
    kubernetes/server/bin/kube-scheduler
    kubernetes/server/bin/cloud-controller-manager.tar
    kubernetes/server/bin/kube-apiserver
    kubernetes/server/bin/kube-controller-manager
    kubernetes/server/bin/kube-aggregator.tar
    kubernetes/server/bin/kube-proxy.docker_tag
    kubernetes/server/bin/kube-apiserver.tar
    kubernetes/server/bin/kube-controller-manager.docker_tag
    kubernetes/server/bin/cloud-controller-manager.docker_tag
    kubernetes/server/bin/kubectl
    kubernetes/server/bin/apiextensions-apiserver
    kubernetes/server/bin/kubelet
    kubernetes/server/bin/cloud-controller-manager
    kubernetes/server/bin/kube-proxy.tar
    kubernetes/server/bin/kube-controller-manager.tar
    kubernetes/server/bin/kube-apiserver.docker_tag
    kubernetes/server/bin/kube-proxy
    kubernetes/server/bin/hyperkube
    kubernetes/server/bin/kube-aggregator
    kubernetes/server/bin/kube-aggregator.docker_tag
    kubernetes/server/bin/kubeadm
    kubernetes/server/bin/mounter
    kubernetes/kubernetes-src.tar.gz
    kubernetes/addons/
    [root@master01 master_pkg]# cd kubernetes/server/bin/
    [root@master01 bin]# mv kube-controller-manager kube-scheduler kube-apiserver /opt/kubernetes/bin/
    [root@master01 bin]# chmod +x /opt/kubernetes/bin/*
    [root@master01 bin]# cp ~/token.csv /opt/kubernetes/cfg/

    配置和启动 kube-apiserver
    创建kube-apiserver配置文件

    [root@master01 bin]# export MASTER_ADDRESS="172.17.8.101"
    [root@master01 bin]# export ETCD_SERVERS="https://172.17.8.101:2379,https://172.17.8.103:2379,https://172.17.8.104:2379"
     
    [root@master01 bin]# cat <<EOF >/opt/kubernetes/cfg/kube-apiserver
     
    KUBE_APISERVER_OPTS="--logtostderr=true \
    --v=4 \
    --etcd-servers=${ETCD_SERVERS} \
    --insecure-bind-address=0.0.0.0 \
    --bind-address=${MASTER_ADDRESS} \
    --insecure-port=8080 \
    --secure-port=6443 \
    --advertise-address=${MASTER_ADDRESS} \
    --allow-privileged=true \
    --service-cluster-ip-range=10.10.10.0/24 \
    --admission-control=NamespaceLifecycle,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota,NodeRestriction 
    --authorization-mode=RBAC,Node \
    --kubelet-https=true \
    --enable-bootstrap-token-auth \
    --token-auth-file=/opt/kubernetes/cfg/token.csv \
    --service-node-port-range=30000-50000 \
    --tls-cert-file=/opt/kubernetes/ssl/server.pem  \
    --tls-private-key-file=/opt/kubernetes/ssl/server-key.pem \
    --client-ca-file=/opt/kubernetes/ssl/ca.pem \
    --service-account-key-file=/opt/kubernetes/ssl/ca-key.pem \
    --etcd-cafile=/opt/kubernetes/ssl/ca.pem \
    --etcd-certfile=/opt/kubernetes/ssl/server.pem \
    --etcd-keyfile=/opt/kubernetes/ssl/server-key.pem"
     
    EOF

    主要参数说明:

    • MASTER_ADDRESS kubernetes的master机器IP地址
    • ETCD_SERVERS etcd的集群地址
    • insecure-bind-address 绑定的http访问地址,这里设置为0.0.0.0,只为了测试使用,生产环境请设置为127.0.0.1
    • bind-address 绑定的安全地址,供外部访问
    • insecure-port 非安全的端口
    • secure-port 安全的端口
    • advertise-address 通告的地址,主要用于集群间的通信
    • allow-privileged 允许授权,允许容器创建时启用这个授权
    • service-cluster-ip-range 分配集群中serice负载均衡的IP范围
    • admission-control 准入模块,只有所有模块都按配置的顺序,通过授权认证之后,才执行该请求
    • authorization-mode 认证模块 RBAC: 基于角色的访问权限控制
    • kubelet-https 启动https访问
    • enable-bootstrap-token-auth 启用token认证(就是咱们创建的token.csv文件, 会下发到node节点上)

    创建kube-apiserver.service文件

    cat <<EOF >/usr/lib/systemd/system/kube-apiserver.service
    [Unit]
    Description=Kubernetes API Server
    Documentation=https://github.com/kubernetes/kubernetes
     
    [Service]
    EnvironmentFile=-/opt/kubernetes/cfg/kube-apiserver
    ExecStart=/opt/kubernetes/bin/kube-apiserver $KUBE_APISERVER_OPTS
    Restart=on-failure
     
    [Install]
    WantedBy=multi-user.target
    EOF

    启动kube-apiserver

    systemctl daemon-reload
     
    systemctl enable kube-apiserver
     
    systemctl restart kube-apiserver
     
    systemctl status kube-apiserver

    https://www.cnblogs.com/Python-K8S/p/14120656.html



  • 相关阅读:
    【转】In ASP.NET using jQuery Uploadify upload attachment
    golang 初体验
    Node.js(express) + MongoDB(mongoose) 简单开发(二)
    Node.js(express) + MongoDB(mongoose) 简单开发(一)
    windows下修改mysql的root密码
    新网站添加百度官方认证
    手写单例模式
    浏览器内核
    IE内核浏览器
    没有猜中开头,更加没有预料结尾的我,正努力走在向程序媛发展的道路上……
  • 原文地址:https://www.cnblogs.com/kebibuluan/p/14541031.html
Copyright © 2011-2022 走看看