Kubernetes部署了好多遍了,但是每次还是会遇到各种问题。有的是新版本问题,有的是以前踩过的坑。因为没有文档记录,坑还在那里,我也还在那里。
本文是以二进制的方式部署,这样方便我们发现和解决问题。
环境说明:
角色 |
组件 |
IP |
备注 |
Master |
kube-apiserver kube-scheduler kube-controller-manager etcd |
10.8.8.27 |
|
Node1 |
Docker Kubelet kube-proxy calico-kube-controllers calico-node |
10.8.8.28 |
|
Node2 |
Docker Kubelet kube-proxy calico-node |
10.8.8.29 |
第一部分:kubernetes安装
1、环境准备
1.1 安装docker
Kubernetes官网文档有介绍,当前版本(k8s 1.13)仅支持docker 1.11之后版本,我这里安装了docker 1.13版本(传统的yum安装:yum install docker)
配置镜像加速,避免后面下载镜像的时候出现超时:
在/etc/docker/daemon.json文件中增加以下内容:
{
"registry-mirrors": ["http://68e02ab9.m.daocloud.io"]
}
设置开机启动:systemctl enable docker
然后我们启动docker:systemctl start docker
1.2 Kubernetes二进制文件准备
从kubernetes官网下载需要安装的版本,我搭建的时候版本是v1.13,所以下载v1.13对应的二进制生成文件,对应连接:https://kubernetes.io/docs/setup/release/notes/#downloads-for-v1-13-0,新版本里面已经不直接提供二进制bin包了,需要手动执行里面的脚本下载。
解压下载的文件后,进入cluster目录,执行get-kube-binaries.sh脚本,会在解压路径下形成kubernetes的二进制文件
二进制文件路径:kubernetes/server/kubernetes/server/bin
管理工具路径:kubernetes/client/bin
2、配置kubernetes
2.1 创建证书
我最开始并没有使用安全认证,所有的API接口都是暴露在非安全接口上。这种方式单纯部署kubernetes没有问题,但是在部署calico的时候,会出现各种错,后面会详细说
2.1.1 创建apiserver的CA证书
使用openssl生成相关证书
#创建ca私钥 openssl genrsa -out ca.key 2048 #生成ca证书 openssl req -x509 -new -nodes -key ca.key -days 10000 -out ca.crt -subj "/CN=k8s-master" #创建apiserver私钥 openssl genrsa -out server.key 2048 #根据配置及私钥生成apiserver的证书请求文件 openssl req -new -key server.key -out apiserver.csr -subj "/CN=k8s-master" -config openssl.cnf #利用CA签发apiserver证书 openssl x509 -req -in apiserver.csr -CA ca.pem -CAkey ca.key -CAcreateserial -out server.crt -days 365 -extensions v3_req -extfile openssl.cnf |
配置文件(openssl.cnf)内容如下:
[req] req_extensions = v3_req distinguished_name = req_distinguished_name [req_distinguished_name] [ v3_req ] basicConstraints = CA:FALSE keyUsage = nonRepudiation, digitalSignature, keyEncipherment subjectAltName = @alt_names [alt_names] DNS.1 = kubernetes DNS.2 = kubernetes.default DNS.3 = kubernetes.default.svc DNS.4 = kubernetes.default.svc.cluster.local IP.1 = 10.0.254.1 IP.2 = 10.8.8.27 |
说明:IP.1 是apisver的cluster IP地址;IP.2 是apisver的宿主主机地址;DNS配置为kube-apiserver虚拟服务名称
以上操作会在当前目录生成:ca.crt ca.key ca.srl server.crt server.csr server.key 六个文件
2.1.2 创建kubernet-controller、kubernet-schedule的CA证书
#生成controller私钥 openssl genrsa -out controller.key 2048 #生成证书申请文件 openssl req -new -key controller.key -out controller.csr -subj "/CN=k8s-master" #签发controller证书 openssl x509 -req -in controller.csr -CA ca.crt -CAkey controller.key -CAcreateserial -out controller.crt -days 365 |
以上操作会生成:controller.crt controller.key controller.csr
2.1.3 创建node1、node2的CA证书
创建方法同2.1.2,只是-subj换成对应的信息,node1换成-subj "/CN=node1",node2换成-subj "/CN=node2"。最终会形成文件:node1.crt node1.csr node1.key node2.crt node2.csr node2.key
至此所有的证书都配置完成了,下面开始配置kubernetes的相关组件
2.2 配置相关组件的启动脚本
2.2.1 在master上配置etcd、kube-apiserver、kube-controller-manager、kube-schedule服务
1)etcd服务
Etcd服务作为kubernetes集群的主数据库,在安装kubernetes各服务之前需要首先安装和启动。从github官网(https://github.com/etcd-io/etcd/releases)下载etcd二进制文件,并将etcd和etcdctl可执行的二进制文件复制到/usr/local/bin目录下。
设置ETCD服务文件
编辑 /lib/systemd/system/etcd.service
[Unit] Description=Etcd Server After=network.target [Service] Type=simple WorkingDirectory=/var/lib/etcd/ EnvironmentFile=/etc/etcd/etcd.conf ExecStart=/usr/local/bin/etcd [Install] WantedBy=multi-user.target |
将服务加入到开机启动:
systemctl daemon-reload
配置ECTD(单机模式)
编辑/etc/etcd/etcd.conf
ETCD_NAME="etcd1" ETCD_DATA_DIR="/export/data/etcd" ETCD_LISTEN_PEER_URLS="http://10.8.8.27:2380" ETCD_LISTEN_CLIENT_URLS="http://10.8.8.27:2379" ETCD_INITIAL_ADVERTISE_PEER_URLS="http://10.8.8.27:2380" ETCD_INITIAL_CLUSTER="etcd1=http |