搭建一套企业级高可用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



 

posted on 2021-03-16 00:29  luzhouxiaoshuai  阅读(332)  评论(0编辑  收藏  举报

导航