(转)基于TLS证书手动部署kubernetes集群(上)

时间:2022-10-23 17:59:17

转:https://www.cnblogs.com/wdliu/archive/2018/06/06/9147346.html

一、简介

Kubernetes是Google在2014年6月开源的一个容器集群管理系统,使用Go语言开发,Kubernetes也叫K8S。 K8S是Google内部一个叫Borg的容器集群管理系统衍生出来的,Borg已经在Google大规模生产运行十年之久。 K8S主要用于自动化部署、扩展和管理容器应用,提供了资源调度、部署管理、服务发现、扩容缩容、监控等一整套功能。 2015年7月,Kubernetes v1.0正式发布,截止到2018年6月,最新稳定版本是v1.10。 Kubernetes目标是让部署容器化应用简单高效。

官方网站:https://kubernetes.io/

二、环境规划

1.软件环境

软件  版本 
操作系统 CentOS Linux release 7.4.1708 (Core)

Kubernetes

1.9

Docker

17.12-ce

Etcd

3.2
Flanneld
 
0.9.1

2.节点规划

角色

IP 组件
master 10.1.210.33

kube-apiserver
kube-controller-manager
kube-scheduler
etcd

node1 10.1.210.32

kubelet
kube-proxy
docker
flannel
etcd

node2 10.1.210.34

kubelet
kube-proxy
docker
flannel
etcd

三、docker部署

1.关闭seliux和firewalld

(转)基于TLS证书手动部署kubernetes集群(上)
#关闭selinux
vi /etc/selinux/config
将SELINUX=enforcing修改为SELINUX=disabled
重启系统 reboot #关闭firewalld
systemctl stop firewalld
(转)基于TLS证书手动部署kubernetes集群(上)

2.如果主机上部署了比较老版本的docker(老版本也可以),先进行卸载,可跳过此步骤

(转)基于TLS证书手动部署kubernetes集群(上)
#查看是否已经安装的Docker软件包
yum list installed | grep docker #移除已经安装的docker包
yum remove docker-ce #删除残留的镜像文件信息
rm -rf /var/lib/docker #找到原有docker残留文件,并删除
find / -name "docker*"
rm -rf 残留文件
(转)基于TLS证书手动部署kubernetes集群(上)

3.安装docker-ce

方式一:

官方安装方法:

(转)基于TLS证书手动部署kubernetes集群(上)
# 安装yum工具包
yum install -y yum-utils device-mapper-persistent-data lvm2 #添加docker-ce stable版本的仓库
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo #安装docker
yum install docker-ce #设置开机自启动
systemctl enable docker.service #启动
systemctl start docker #查看是否安装成功
docker info
(转)基于TLS证书手动部署kubernetes集群(上)

方式二:

使用阿里云镜像,速度更快,安装步骤:

(转)基于TLS证书手动部署kubernetes集群(上)
#  安装yum工具包
yum install -y yum-utils device-mapper-persistent-data lvm2 # 添加仓库
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # 更新yum源缓存
yum makecache fast # 查找Docker-CE的版本:
yum list docker-ce.x86_64 --showduplicates | sort -r #安装指定版本docker
#yum -y install docker-ce-[VERSION]
yum install docker-ce-17.12.0.ce-1.el7.centos
(转)基于TLS证书手动部署kubernetes集群(上)

4.可能出现的错误:

启动报错:docker Failed to start docker.service: Unit not found,这个问题苦恼了半天,重装了几遍还是一样,网上很多方法都没有解决,后来把以前装的docker文件删除干净,再重装,启动成功了。

原因:由于旧版docker的配置文件或者安装文件没有完全删除,这个问题苦恼了半天。

解决版本:卸载现有版本的docker,使用find / -name "docker*" 找到安装的文件,全部删除,再安装新的docker

四、生成自签TLS证书

1.安装证书生成工具cfssl

这里我选择在master上进行证书的生成

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

2.生成模版json

(转)基于TLS证书手动部署kubernetes集群(上)
# 建立存放生成的证书文件,方便管理
mkdir -p /opt/kubernetes/ssl
cd /opt/kubernetes/ssl
# 生成证书模版
cfssl print-defaults config > config.json ###生成的模版示列####
#cat config.json {
"signing": {
"default": {
"expiry": "168h"
},
"profiles": {
"www": {
"expiry": "8760h",
"usages": [
"signing",
"key encipherment",
"server auth"
]
},
"client": {
"expiry": "8760h",
"usages": [
"signing",
"key encipherment",
"client auth"
]
}
}
}
}
(转)基于TLS证书手动部署kubernetes集群(上)

3.修改TLS模版证书为我们自己使用:

(转)基于TLS证书手动部署kubernetes集群(上)
{
"signing": {
"default": {
"expiry": "87600h"
},
"profiles": {
"kubernetes": {
"expiry": "87600h",
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
]
}
}
}
}
(转)基于TLS证书手动部署kubernetes集群(上)

4.生成ca模版以及修改模版

(转)基于TLS证书手动部署kubernetes集群(上)
#生成csr模版
cfssl print-defaults csr > csr.json
#结果
{
"CN": "example.net",
"hosts": [
"example.net",
"www.example.net"
],
"key": {
"algo": "ecdsa",
"size": 256
},
"names": [
{
"C": "US",
"L": "CA",
"ST": "San Francisco"
}
]
} # 修改csr文件为我们使用
{
"CN": "kubernetes",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "Beijing",
"ST": "Beijing",
"O": "k8s",
"OU": "System"
}
]
}
(转)基于TLS证书手动部署kubernetes集群(上)

5.生成证书、和key

cfssl gencert -initca csr.json | cfssljson -bare ca -

6.由于需要生成的证书太多,并且容易出错,一旦出错整个下面的步骤都将进行不下去,所以编写了脚本进行生成,注意,其中需要修改为自己集群IP地址,下面是是脚本:

cat > ca-config.json <<EOF
{
"signing": {
"default": {
"expiry": "87600h"
},
"profiles": {
"kubernetes": {
"expiry": "87600h",
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
]
}
}
}
}
EOF cat > ca-csr.json <<EOF
{
"CN": "kubernetes",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "Beijing",
"ST": "Beijing",
"O": "k8s",
"OU": "System"
}
]
}
EOF cfssl gencert -initca ca-csr.json | cfssljson -bare ca - #----------------------- cat > server-csr.json <<EOF
{
"CN": "kubernetes",
"hosts": [
"127.0.0.1",
"10.1.210.32",
"10.1.210.33",
"10.1.210.34",
"10.10.10.1",
"kubernetes",
"kubernetes.default",
"kubernetes.default.svc",
"kubernetes.default.svc.cluster",
"kubernetes.default.svc.cluster.local"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "BeiJing",
"ST": "BeiJing",
"O": "k8s",
"OU": "System"
}
]
}
EOF cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes server-csr.json | cfssljson -bare server #----------------------- cat > admin-csr.json <<EOF
{
"CN": "admin",
"hosts": [],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "BeiJing",
"ST": "BeiJing",
"O": "system:masters",
"OU": "System"
}
]
}
EOF cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes admin-csr.json | cfssljson -bare admin #----------------------- cat > kube-proxy-csr.json <<EOF
{
"CN": "system:kube-proxy",
"hosts": [],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "BeiJing",
"ST": "BeiJing",
"O": "k8s",
"OU": "System"
}
]
}
EOF cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kube-proxy-csr.json | cfssljson -bare kube-proxy

cerificate.sh

7.执行脚本完成后,会生成如下证书文件:

(转)基于TLS证书手动部署kubernetes集群(上)

8.证书使用组件说明:

组件   使用的证书
etcd ca.pem server.pem server-key.pem
flannel ca.pem server.pem server-key.pem
kube-apiserver ca.pem server.pem server-key.pem
kubelet ca.pem ca-key.pem
kube-proxy ca.pem kube-proxy.pem kube-proxy-key.pem
kubectl ca.pem admin.pem admin-key.pem
五、部署etcd集群

1.软件包下载

下载地址:https://github.com/coreos/etcd/releases/download/v3.2.12/etcd-v3.2.12-linux-amd64.tar.gz

2.解压,配置。注意,这里为了规范,将所有软件部署在/opt/kubernetes目录下

(转)基于TLS证书手动部署kubernetes集群(上)
#创建部署目录
mkdir /opt/kubernetes -p #创建其他目录,包括配置文件、可执行脚本、
mkdir /opt/kubernetes/{bin,conf,ssl} #解压
tar zxvf etcd-v3.2.12-linux-amd64.tar.gz #拷贝可执行文件
cp etcd-v3.2.12-linux-amd64/etcd /opt/kubernetes/bin/
cp etcd-v3.2.12-linux-amd64/etcdctl /opt/kubernetes/bin/
(转)基于TLS证书手动部署kubernetes集群(上)

3.创建配置文件与服务unit,使用配置文件时候请删除注释。

(转)基于TLS证书手动部署kubernetes集群(上)
 vi /opt/kubernetes/conf/etcd.conf

#[Member]
ETCD_NAME="etcd02"
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="https://10.1.210.33:2380" #集群通信端口
ETCD_LISTEN_CLIENT_URLS="https://10.1.210.33:2379" #监听的数据端口 #[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://10.1.210.33:2380"
ETCD_ADVERTISE_CLIENT_URLS="https://10.1.210.33:2379"
ETCD_INITIAL_CLUSTER="etcd01=https://10.1.210.32:2380,etcd02=https://10.1.210.33:2380,etcd03=https://10.1.210.34:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster" #认证token
ETCD_INITIAL_CLUSTER_STATE="new" #集群建立状态 vi /usr/lib/systemd/system/etcd.service
###### 服务配置启动配置 [Unit]
Description=Etcd Server
After=network.target
After=network-online.target
Wants=network-online.target [Service]
Type=notify
EnvironmentFile=-/opt/kubernetes/conf/etcd.conf
ExecStart=/opt/kubernetes/bin/etcd \
--name=${ETCD_NAME} \
--data-dir=${ETCD_DATA_DIR} \
--listen-peer-urls=${ETCD_LISTEN_PEER_URLS} \
--listen-client-urls=${ETCD_LISTEN_CLIENT_URLS},http://127.0.0.1:2379 \
--advertise-client-urls=${ETCD_ADVERTISE_CLIENT_URLS} \
--initial-advertise-peer-urls=${ETCD_INITIAL_ADVERTISE_PEER_URLS} \
--initial-cluster=${ETCD_INITIAL_CLUSTER} \
--initial-cluster-token=${ETCD_INITIAL_CLUSTER} \
--initial-cluster-state=new \
--cert-file=/opt/kubernetes/ssl/server.pem \
--key-file=/opt/kubernetes/ssl/server-key.pem \
--peer-cert-file=/opt/kubernetes/ssl/server.pem \
--peer-key-file=/opt/kubernetes/ssl/server-key.pem \
--trusted-ca-file=/opt/kubernetes/ssl/ca.pem \
--peer-trusted-ca-file=/opt/kubernetes/ssl/ca.pem
Restart=on-failure
LimitNOFILE=65536 [Install]
WantedBy=multi-user.target
(转)基于TLS证书手动部署kubernetes集群(上)

4.重载system服务,启动etcd

systemctl daemon-reload
systemctl start etcd

5.其他两个节点做相同的操作,注意配置文件稍微有些变化,这里就不重复说明,由于使用了证书,所有查看集群操作都需要使用证书,如下:

/opt/kubernetes/bin/etcdctl \
> --ca-file=/opt/kubernetes/ssl/ca.pem \
> --cert-file=/opt/kubernetes/ssl/server.pem \
> --key-file=/opt/kubernetes/ssl/server-key.pem cluster-health

如图下所示,我们的etcd集群部署完成

(转)基于TLS证书手动部署kubernetes集群(上)

六、部署flannel网络服务

1.分配集群网络存储到etcd中,以供flannel使用

/opt/kubernetes/bin/etcdctl \
> --ca-file=/opt/kubernetes/ssl/ca.pem \
> --cert-file=/opt/kubernetes/ssl/server.pem \
> --key-file=/opt/kubernetes/ssl/server-key.pem set /coreos.com/network/config '{ "Network": "172.17.0.0/16", "Backend": {"Type": "vxlan"}}'

2.下载安装包

下载地址:https://github.com/coreos/flannel/releases/download/v0.9.1/flannel-v0.9.1-linux-amd64.tar.gz

3.部署、配置flannel,这里需要注意,flannel网络是在node节点上进行的,所有我们在10.1.210.32、10.1.210.34上进行部署,以10.1.210.32为列

(转)基于TLS证书手动部署kubernetes集群(上)
#解压
tar zxvf flannel-v0.9.1-linux-amd64.tar.gz #拷贝启动脚本
cp flanneld /opt/kubernetes/bin/
cp mk-docker-opts.sh /opt/kubernetes/bin/ #配置文件配置:
vi /opt/kubernetes/conf/flanneld.conf ETCD_ENDPOINTS="--etcd-endpoints=https://10.1.210.32:2379,https://10.1.210.33:2379,https://10.1.210.34:2379"
FLANNEL_OPTIONS="--etcd-endpoints=${ETCD_ENDPOINTS} \
-etcd-cafile=/opt/kubernetes/ssl/ca.pem \
-etcd-certfile=/opt/kubernetes/ssl/server.pem \
-etcd-keyfile=/opt/kubernetes/ssl/server-key.pem" #启动服务器配置
vi /usr/lib/systemd/system/flanneld.service [Unit]
Description=Flanneld overlay address etcd agent
After=network-online.target network.target
Before=docker.service [Service]
Type=notify
EnvironmentFile=/opt/kubernetes/conf/flanneld.conf
ExecStart=/opt/kubernetes/bin/flanneld --ip-masq \$FLANNEL_OPTIONS
ExecStartPost=/opt/kubernetes/bin/mk-docker-opts.sh -k DOCKER_NETWORK_OPTIONS -d /run/flannel/subnet.env
Restart=on-failure [Install]
WantedBy=multi-user.target
(转)基于TLS证书手动部署kubernetes集群(上)

4.启动

systemctl daemon-reload
systemctl start flanneld

5.启动成功后会生成flannel的网卡如下图:

(转)基于TLS证书手动部署kubernetes集群(上)

6.修改docker配置文件指定flannel网络

vi /usr/lib/systemd/system/docker.service

#修改为
EnvironmentFile=/run/flannel/subnet.env
ExecStart=/usr/bin/dockerd $DOCKER_NETWORK_OPTIONS

7.重启docker,检查docker0网卡是否和flannel网卡网段一致

systemctl daemon-reload
systemctl restart docker

8.在集群的另一个节点也按照同样的方法安装,检查两个节点flannel网络是否通信的办法互ping flannel网关(网卡IP)

(转)基于TLS证书手动部署kubernetes集群(上)的更多相关文章

  1. 基于TLS证书手动部署kubernetes集群&lpar;上&rpar;

    一.简介 Kubernetes是Google在2014年6月开源的一个容器集群管理系统,使用Go语言开发,Kubernetes也叫K8S. K8S是Google内部一个叫Borg的容器集群管理系统衍生 ...

  2. 基于TLS证书手动部署kubernetes集群&lpar;下&rpar;

    一.master节点组件部署 承接上篇文章--基于TLS证书手动部署kubernetes集群(上),我们已经部署好了etcd集群.flannel网络以及每个节点的docker,接下来部署master节 ...

  3. (转)基于TLS证书手动部署kubernetes集群&lpar;下&rpar;

    转:https://www.cnblogs.com/wdliu/p/9152347.html 一.master节点组件部署 承接上篇文章--基于TLS证书手动部署kubernetes集群(上),我们已 ...

  4. 基于TLS证书手动部署kubernetes集群

      一.简介 Kubernetes是Google在2014年6月开源的一个容器集群管理系统,使用Go语言开发,Kubernetes也叫K8S. K8S是Google内部一个叫Borg的容器集群管理系统 ...

  5. 二进制部署 Kubernetes 集群

    二进制部署 Kubernetes 集群   提供的几种Kubernetes部署方式 minikube Minikube是一个工具,可以在本地快速运行一个单点的Kubernetes,尝试Kubernet ...

  6. 和我一步步部署 kubernetes 集群

    和我一步步部署 kubernetes 集群 本系列文档介绍使用二进制部署最新 kubernetes v1.6.1 集群的所有步骤,而不是使用 kubeadm 等自动化方式来部署集群: 在部署的过程中, ...

  7. kubeadm部署Kubernetes集群

    Preface 通过kubeadm管理工具部署Kubernetes集群,相对离线包的二进制部署集群方式而言,更为简单与便捷.以下为个人学习总结: 两者区别在于前者部署方式使得大部分集群组件(Kube- ...

  8. 在CentOS7上部署Kubernetes集群

    在CentOS7上部署Kubernetes集群 文/FCBusquest 2015-12-22 18:36:00 简介 Kubernetes(k8s)是Google开源的大规模容器集群管理系统, 本文 ...

  9. 使用Kubespray部署Kubernetes集群

    转载请标明出处: http://blog.csdn.net/forezp/article/details/82730382 本文出自方志朋的博客 Kubespray是Google开源的一个部署生产级别 ...

随机推荐

  1. 安全测试 - XSS如何防御

    XSS主要是通过劫持用户COOKIE,执行JS脚本进行攻击 如何发现: 可以使用<script>alert(/yourname/)</script> script最具有代表性也 ...

  2. webservice服务的简单应用

    本人目前刚接触到webservice服务,知道它是一个为外部提供接口的服务,下面大概讲一下webservice是如何应用的. 在此我只针对ASP.NET 讲一个是如何应用的: 1. 打开VS ,在WE ...

  3. 编码符&lowbar;new

    begin#6BE3803ED5339EBA1028EF9FC2BBD85F196391DFC603EAE8B10BA25D0B69029667A9BD2D914CE59A26EF5ECF370D5C ...

  4. Ext4&period;2 grid 条件查询使用

    项目中用到Ext4.2,初次接触,用的不是太熟,做个总结,恳请指正! 1.grid重新设置条件,查询结果不是从第1页开始 在处理grid条件查询时,点击搜索按钮调用store.load()方法时,会把 ...

  5. LeetCode——Spiral Matrix

    Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral or ...

  6. 切换self&period;window&period;rootViewController根视图,导致上一视图控制器不能释放销毁的问题

    在我们APP开发中经常有首次进入应用先进入引导页或者登陆页的情况,类似下图所示      发现登陆以后更改window.rootViewController为应用首页时,登陆页没有销毁掉,通过图层工具 ...

  7. jQuery 事件——关于select选中

    场景: eg:在管理一篇博文时,因博文的管理有一列叫:状态的列,该列有诸多状态,如:正常,待审核,删除等... 此时,若使用Select下拉列表进行状态选择,并在选中具体项值后,通过Ajax异步提交, ...

  8. 用Stax方式处理xml

    1.读取xml文件,首先用类加载器加载项目目录下的xml文件,从XMLInputFactory创建我所需要的XMLStreamReader,即得到了xml文件.根据XMLStreamConstant ...

  9. day2--通过setup设置网卡

    配置IP地址,安装完成centos之后,需要配IP地址,流程如下: 1.首先开启虚拟机,如下: 2.登陆账号,root账户登陆,如下: 3.输入setup,按回车键进入,设置IP的方法有很多种,此处采 ...

  10. 谈谈java中的线程&lpar;初级概念&rpar;

    定义 关于进程与线程的定义 可参看一下这个介绍 http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html 在不细抠定义的情况下 ...