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

systemctl  enable  etcd.service

  • 配置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