Skip to content

Commit

Permalink
refine
Browse files Browse the repository at this point in the history
  • Loading branch information
Zhang Jun committed Jun 17, 2018
1 parent 67a0ded commit 7190a79
Show file tree
Hide file tree
Showing 35 changed files with 387 additions and 370 deletions.
Binary file modified .DS_Store
Binary file not shown.
10 changes: 5 additions & 5 deletions 00.组件版本和集群环境.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,8 @@ kube-apiserver:

+ 关闭非安全端口 8080 和匿名访问;
+ 严格的认证和授权策略 (x509、token、RBAC);
+ 开启 bootstrap token 认证,从而支持 kubelet TLS bootstrapping;
+ 使用 https 和证书访问 kubelet、etcd,加密通信;
+ 开启 bootstrap token 认证,支持 kubelet TLS bootstrapping;
+ 使用 https 访问 kubelet、etcd,加密通信;

kube-controller-manager:

Expand All @@ -44,8 +44,8 @@ kube-scheduler:

kubelet:

+ 使用 kubeadm 动态 bootstrap 所需的 token,而不是在 apiserver 中静态配置;
+ 使用 TLS bootstrap 机制自动获取 client 和 server 证书,过期后自动轮转;
+ 使用 kubeadm 动态创建 bootstrap token,而不是在 apiserver 中静态配置;
+ 使用 TLS bootstrap 机制自动生成 client 和 server 证书,过期后自动轮转;
+ 在 KubeletConfiguration 类型的 JSON 文件配置主要参数;
+ 关闭只读端口,只在 10250 安全端口接收所有 https 请求,且对请求进行认证和授权,拒绝匿名访问和非授权访问;
+ 使用 kubeconfig 访问 apiserver 的安全端口;
Expand All @@ -60,6 +60,6 @@ kube-proxy:

+ DNS:使用功能、性能更好的 coredns;
+ Dashboard:支持登录认证;
+ Metric 收集:heapster、metrics-server,使用 https 访问 kubelet 安全端口;
+ Metric:heapster、metrics-server,使用 https 访问 kubelet 安全端口;
+ Log:Elasticsearch、Fluend、Kibana;
+ Registry 镜像库:docker-registry、harbor;
103 changes: 63 additions & 40 deletions 01.系统初始化.md → 01.系统初始化和全局变量.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,22 +2,22 @@

tags: system-env

# 系统初始化
# 系统初始化和全局变量

## 集群机器

+ kube-node1:172.27.129.105
+ kube-node2:172.27.129.111
+ kube-node3:172.27.129.112

vagrant 目录下提供了 Vagrantfile 文件,可以使用 vagrant 和 virtualbox 创建对应的三台虚机
可以使用 vagrant 和 vagrant 目录下的 Vagrantfile 文件创建三台虚机

``` bash
$ cd vagrant
$ vagrant up
```

本着测试的目的,etcd 集群、kubernetes master、kubernetes node 均使用这三台机器
本文档中的 etcd 集群、master 节点、worker 节点均使用这三台机器

## 主机名

Expand All @@ -30,33 +30,36 @@ $ grep kube-node /etc/hosts
172.27.129.112 kube-node3 kube-node3
```

## 运行账户
## 添加 k8s 和 docker 账户

在每台机器上添加 k8s 账户,开启无密码 sudo:

``` bash
[root@localhost ~]# useradd -m k8s
[root@localhost ~]# visudo
[root@test-105 ~]# grep '%wheel.*NOPASSWD: ALL' /etc/sudoers
$ sudo useradd -m k8s
$ sudo visudo
$ sudo grep '%wheel.*NOPASSWD: ALL' /etc/sudoers
%wheel ALL=(ALL) NOPASSWD: ALL
[root@localhost ~]# gpasswd -a k8s wheel
[root@localhost ~]# echo 'PATH=/opt/k8s/bin:$PATH:$HOME/bin:$JAVA_HOME/bin' >>/root/.bashrc
[k8s@localhost ~]$ echo 'PATH=/opt/k8s/bin:$PATH:$HOME/bin:$JAVA_HOME/bin' >>~/.bashrc
$ sudo gpasswd -a k8s wheel
```

## docker 账户和配置
添加 docker 账户,将 k8s 账户添加到 docker 组中,同时配置 dockerd 参数:

``` bash
[root@kube-node1 ~]# useradd -m docker
[root@kube-node1 ~]# gpasswd -a k8s docker
[root@kube-node1 ~]# mkdir -p /etc/docker/
[root@kube-node1 ~]# cat /etc/docker/daemon.json
$ sudo useradd -m docker
$ sudo gpasswd -a k8s docker
$ sudo mkdir -p /etc/docker/
$ cat /etc/docker/daemon.json
{
"registry-mirrors": ["https://hub-mirror.c.163.com", "https://docker.mirrors.ustc.edu.cn"],
"insecure-registries": ["docker02:35000"],
"max-concurrent-downloads": 20
}
```

## 无秘钥登录
## 无密码 ssh 登录其它节点

如果没有特殊指明,本文档的所有操作**均在 kube-node1 节点上执行**,然后远程分发文件和执行命令。

设置 kube-node1 可以无密码登录**所有节点**的 k8s 和 root 账户:

``` bash
[k8s@kube-node1 k8s]$ ssh-keygen -t rsa
Expand All @@ -69,61 +72,76 @@ $ grep kube-node /etc/hosts
[k8s@kube-node1 k8s]$ ssh-copy-id k8s@kube-node3
```

## 将可执行文件路径 /opt/k8s/bin 添加到 PATH 变量中

在每台机器上添加环境变量:

``` bash
$ sudo echo 'PATH=/opt/k8s/bin:$PATH:$HOME/bin:$JAVA_HOME/bin' >>/root/.bashrc
$ echo 'PATH=/opt/k8s/bin:$PATH:$HOME/bin:$JAVA_HOME/bin' >>~/.bashrc
```

## 安装依赖包

在每台机器上安装依赖包:

``` bash
[root@kube-node1 ~]# yum install -y epel-release
[root@localhost ~]# yum install -y vim go conntrack ipvsadm ipset jq sysstat curl iptables # ipvs 依赖 ipset
$ sudo yum install -y epel-release
$ sudo yum install -y vim go conntrack ipvsadm ipset jq sysstat curl iptables # ipvs 依赖 ipset
```

## 关闭防火墙

在每台机器上关闭防火墙:

``` bash
[root@kube-node1 ~]# systemctl stop firewalld
[root@kube-node1 ~]# systemctl disable firewalld
[root@kube-node1 ~]# sudo iptables -P FORWARD ACCEPT
$ sudo systemctl stop firewalld
$ sudo systemctl disable firewalld
$ sudo sudo iptables -P FORWARD ACCEPT
```

## 创建目录

在每台机器上创建目录:

``` bash
[root@localhost ~]# mkdir -p /opt/k8s/bin
[root@localhost ~]# chown -R k8s /opt/k8s
$ sudo mkdir -p /opt/k8s/bin
$ sudo chown -R k8s /opt/k8s

[root@kube-node1 ~]# sudo mkdir -p /etc/kubernetes/ssl
[root@kube-node1 ~]# chown -R k8s /etc/kubernetes
$ sudo sudo mkdir -p /etc/kubernetes/cert
$ sudo chown -R k8s /etc/kubernetes

[root@kube-node1 ~]# mkdir -p /etc/etcd/ssl
[root@kube-node1 ~]# chown -R k8s /etc/etcd/ssl
$ sudo mkdir -p /etc/etcd/cert
$ sudo chown -R k8s /etc/etcd/cert

[root@kube-node1 ~]# mkdir -p /var/lib/etcd && chown -R k8s /etc/etcd/ssl
$ sudo mkdir -p /var/lib/etcd && chown -R k8s /etc/etcd/cert
```

## 集群环境变量

后续的部署步骤将使用下面定义的全局环境变量,根据**自己的机器、网络情况**修改:
后续的部署步骤将使用下面定义的全局环境变量,请根据**自己的机器、网络情况**修改:

``` bash
#!/usr/bin/bash

# 生成 EncryptionConfig 所需的加密 key
ENCRYPTION_KEY=$(head -c 32 /dev/urandom | base64)

# 最好使用 主机未用的网段 来定义服务网段和 Pod 网段
# 最好使用 当前未用的网段 来定义服务网段和 Pod 网段

# 服务网段 (Service CIDR),部署前路由不可达,部署后集群内使用IP:Port可达
# 服务网段,部署前路由不可达,部署后集群内使用IP:Port可达
SERVICE_CIDR="10.254.0.0/16"

# POD 网段 (Cluster CIDR),部署前路由不可达,**部署后**路由可达(flanneld保证)
# Pod 网段,必须是 /16 段地址,部署前路由不可达,**部署后**路由可达(flanneld保证)
CLUSTER_CIDR="172.30.0.0/16"

# 服务端口范围 (NodePort Range)
export NODE_PORT_RANGE="8400-9000"

# 集群所有机器 IP
# 集群各机器 IP 数组
export NODE_IPS=(172.27.129.105 172.27.129.111 172.27.129.112)

# 集群各 IP 对应的 主机名
# 集群各 IP 对应的 主机名数组
export NODE_NAMES=(kube-node1 kube-node2 kube-node3)

# kube-apiserver 节点 IP
Expand All @@ -135,7 +153,7 @@ export KUBE_APISERVER="https://${MASTER_NODE}:6443"
# etcd 集群服务地址列表
export ETCD_ENDPOINTS="https://172.27.129.105:2379,https://172.27.129.111:2379,https://172.27.129.112:2379"

# etcd 集群间通信的IP和端口
# etcd 集群间通信的 IP 和端口
export ETCD_NODES="kube-node1=https://172.27.129.105:2380,kube-node2=https://172.27.129.111:2380,kube-node3=https://172.27.129.112:2380"

# flanneld 网络配置前缀
Expand All @@ -150,16 +168,21 @@ export CLUSTER_DNS_SVC_IP="10.254.0.2"
# 集群 DNS 域名
export CLUSTER_DNS_DOMAIN="cluster.local."

# 将二进制目录 /opt/k8s/bin 加入到 PATH 中
# 将二进制目录 /opt/k8s/bin 加到 PATH 中
export PATH=/opt/k8s/bin:$PATH
```
+ 打包后的变量定义见 [environment.sh](https://github.com/opsnull/follow-me-install-kubernetes-cluster/blob/master/manifests/environment.sh),后续部署时会**提示导入**该脚本;

## 分发集群环境变量定义脚本

把全局变量定义脚本拷贝到**所有**机器的 `/opt/k8s/bin` 目录:
把全局变量定义脚本拷贝到**所有**节点的 `/opt/k8s/bin` 目录:

``` bash
$ cp environment.sh /opt/k8s/bin
$ chmod +x /opt/k8s/bin/*
source environment.sh
for node_ip in ${NODE_IPS[@]}
do
echo ">>> ${node_ip}"
scp environment.sh k8s@${node_ip}:/opt/k8s/bin/
ssh k8s@${node_ip} "chmod +x /opt/k8s/bin/*"
done
```
25 changes: 13 additions & 12 deletions 02.创建CA证书和秘钥.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ tags: TLS, CA

# 创建 CA 证书和秘钥

为确保安全,`kubernetes` 系统各组件需要使用 `TLS` 证书对通信进行加密和认证。
为确保安全,`kubernetes` 系统各组件需要使用 `x509 TLS` 证书对通信进行加密和认证。

CA (Certificate Authority) 是自签名的根证书,用来签名后续创建的其它证书。

Expand All @@ -13,7 +13,7 @@ CA (Certificate Authority) 是自签名的根证书,用来签名后续创建
## 安装 cfssl 工具集

``` bash
sudo mkdir -p /opt/k8s/ssl && sudo chown -R k8s /opt/k8s && cd /opt/k8s
sudo mkdir -p /opt/k8s/cert && sudo chown -R k8s /opt/k8s && cd /opt/k8s
wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
mv cfssl_linux-amd64 /opt/k8s/bin/cfssl

Expand All @@ -30,8 +30,8 @@ export PATH=/opt/k8s/bin:$PATH
## 创建根证书 (CA)

注意:
1. CA 证书是集群所有节点共享的,后续创建的所有证书都由它签名,**只需要创建一个 CA 证书**
1. k8s 账户必须可读写证书目录 `/etc/kubernetes/ssl` 中的文件;
1. CA 证书是集群所有节点共享的,**只需要创建一个 CA 证书**,后续创建的所有证书都由它签名
1. k8s 账户必须可读写证书目录 `/etc/kubernetes/cert` 中的文件;

### 创建配置文件

Expand All @@ -42,7 +42,7 @@ cat > ca-config.json <<EOF
{
"signing": {
"default": {
"expiry": "8760h"
"expiry": "87600h"
},
"profiles": {
"kubernetes": {
Expand All @@ -52,7 +52,7 @@ cat > ca-config.json <<EOF
"server auth",
"client auth"
],
"expiry": "8760h"
"expiry": "87600h"
}
}
}
Expand Down Expand Up @@ -85,8 +85,9 @@ cat > ca-csr.json <<EOF
}
EOF
```
+ "CN":`Common Name`,kube-apiserver 从证书中提取该字段作为请求的用户名 (User Name),浏览器使用该字段验证网站是否合法;
+ "O":`Organization`,kube-apiserver 从证书中提取该字段作为请求用户所属的组 (Group);
+ CN:`Common Name`,kube-apiserver 从证书中提取该字段作为请求的**用户名 (User Name)**,浏览器使用该字段验证网站是否合法;
+ O:`Organization`,kube-apiserver 从证书中提取该字段作为请求用户所属的**组 (Group)**
+ 从 CN 中提取的 User、从 O 中提取的 Group,后续将作为 kube-apiserver `RBAC` 授权的参考;

### 生成 CA 证书和私钥

Expand All @@ -95,20 +96,20 @@ cfssl gencert -initca ca-csr.json | cfssljson -bare ca
ls ca*
```

## 分发 CA 证书文件
## 分发证书文件

将生成的 CA 证书、秘钥文件、配置文件拷贝到**所有节点**`/etc/kubernetes/ssl` 目录下:
将生成的 CA 证书、秘钥文件、配置文件拷贝到**所有节点**`/etc/kubernetes/cert` 目录下:

``` bash
source /opt/k8s/bin/environment.sh # 导入 NODE_IPS 环境变量
for node_ip in ${NODE_IPS[@]}
do
echo ">>> ${node_ip}"
scp ca*.pem ca-config.json k8s@kube-node2:/etc/kubernetes/ssl
scp ca*.pem ca-config.json k8s@${node_ip}:/etc/kubernetes/cert
done
```
+ k8s 账户需要有读写 /etc/kubernetes 目录及其子目录文件的权限;

## 参考
## 参考

1. 各种 CA 证书类型:https://github.com/kubernetes-incubator/apiserver-builder/blob/master/docs/concepts/auth.md
Loading

0 comments on commit 7190a79

Please sign in to comment.