一、部署说明
1.节点
1 | master1: IP:192.168.0.170/24 hostname:171 |
2.工具版本:
1 | etcd-v3.1.10-linux-amd64.tar.gz |
docker离线镜像:
1 | etcd-amd64_v3.1.10.tar |
以上安装包的云盘链接随后附上.有梯子翻墙的直接装,无需离线包。
组件作用说明
集群两个最重要的核心:apiserver master和etcd
1.apiserver master:(需高可用)集群核心,集群API接口、集群各个组件通信的中枢;集群安全控制;
2.etcd :(需高可用)集群的数据中心,用于存放集群的配置以及状态信息,非常重要,如果数据丢失那么集群将无法恢复;因此高可用集群部署首先就是etcd是高可用集群;
kube-scheduler:调度器 (内部自选举)集群Pod的调度中心;默认kubeadm安装情况下–leader-elect参数已经设置为true,保证master集群中只有一个kube-scheduler处于活跃状态;
3.kube-controller-manager: 控制器(内部自选举)集群状态管理器,当集群状态与期望不同时,kcm会努力让集群恢复期望状态,比如:当一个pod死掉,kcm会努力新建一个pod来恢复对应replicasset期望的状态;默认kubeadm安装情况下–leader-elect参数已经设置为true,保证master集群中只有一个kube-controller-manager处于活跃状态;
4.kubelet: 将agent node注册上apiserver,是运行在每个node上的集群管理工具
5.scheduler:专门负责pod的调度任务,根据预定义的各种调度规则,将待调度的pod分配至某一个节点上。
二、提前准备
1.关闭防火墙,selinux,swap
1 | systemctl stop firewalld |
2.内核开启网络支持
1 | cat <<EOF > /etc/sysctl.d/k8s.conf |
若执行sysctl -p 时报错,尝试:
1 | modprobe br_netfilter |
三、配置keepalived
1 | yum -y install keepalived |
检查vip是否正常漂在master1上:
1 | [root@170 pkgs]# ip a |
四、etcd配置
1.配置环境变量:
1 | export NODE_NAME=170 #当前部署的机器名称(随便定义,只要能区分不同机器即可) |
2.创建ca和证书和秘钥
1 | wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 |
生成ETCD的TLS 秘钥和证书
为了保证通信安全,客户端(如 etcdctl) 与 etcd 集群、etcd 集群之间的通信需要使用 TLS 加密,本节创建 etcd TLS 加密所需的证书和私钥。
创建 CA 配置文件:
1 | cat > ca-config.json <<EOF |
==ca-config.json==:可以定义多个 profiles,分别指定不同的过期时间、使用场景等参数;后续在签名证书时使用某个 profile;
==signing==:表示该证书可用于签名其它证书;生成的 ca.pem 证书中 CA=TRUE;
==server auth==:表示 client 可以用该 CA 对 server 提供的证书进行验证;
==client auth==:表示 server 可以用该 CA 对 client 提供的证书进行验证;
1 | cat > ca-csr.json <<EOF |
“CN”:Common Name,kube-apiserver 从证书中提取该字段作为请求的用户名 (User Name);浏览器使用该字段验证网站是否合法;
“O”:Organization,kube-apiserver 从证书中提取该字段作为请求用户所属的组 (Group);
==生成 CA 证书和私钥==:
1 | cfssl gencert -initca ca-csr.json | cfssljson -bare ca |
==创建 etcd 证书签名请求:==
1 | cat > etcd-csr.json <<EOF |
hosts 字段指定授权使用该证书的 etcd 节点 IP;
每个节点IP 都要在里面 或者 每个机器申请一个对应IP的证书
生成 etcd 证书和私钥:
1 | cfssl gencert -ca=ca.pem \ |
将生成的私钥文件分发到master2上:
1 | scp -r /etc/etcd/ssl root@192.168.0.171:/etc/etcd/ |
3.安装etcd
1 | wget http://github.com/coreos/etcd/releases/download/v3.1.10/etcd-v3.1.10-linux-amd64.tar.gz |
master2同样方法安装etcd
验证服务
1 | etcdctl \ |
预期结果:
1 | 2018-04-06 20:07:41.355496 I | warning: ignoring ServerName for user-provided CA for backwards compatibility is deprecated |
若有失败,重新配置
1 | systemctl stop etcd |
五.docker安装
若原来已经安装docker版本,建议卸载后安装docker-ce版本:
1 | yum -y remove docker docker-common |
基于aliyun安装docker-ce方法:
1 | sudo yum install -y yum-utils device-mapper-persistent-data lvm2 |
六.安装kubelet、kubectl、kubeadm、kubecni
准备好提前下载好的rpm包:
1 | [root@170 pkgs]# cd /root/k8s_images/pkgs |
修改kubelet启动参数里的cgroup驱动以便兼容docker:
1 | vi /etc/systemd/system/kubelet.service.d/10-kubeadm.conf |
在master2上同样操作
七.kubeadm初始化
将准备好的本地的docker images镜像导入本地仓库内
1 | [root@170 docker_images]# ls |
config.yaml初始化配置文件:
1 | cat <<EOF > config.yaml |
初始化集群
1 | kubeadm init --config config.yaml |
结果:
1 | To start using your cluster, you need to run the following as a regular user: |
注意:提示信息中的kubeadm join那一行请保存好,后期使用kubeadm扩增集群node时,需要在新的node上使用这行命令加入集群
1 | mkdir -p $HOME/.kube |
配置master2:
1 | #拷贝pki 证书 |
八、安装网络插件kube-router
1 | # kube-router的daemonSet部署yaml文件地址: |
部署完成
默认情况下,为了保证master的安全,master是不会被调度到app的。给master添加调度taint污点,打破这个限制,使pod可以调度在master上:
1 | kubectl taint nodes --all node-role.kubernetes.io/master- |
配置私有docker仓库,加速使用:
1 | vim /lib/systemd/system/docker.service |
2018-6-8补充:
k8s集群通过kubeadm加入新的node:
在集群初始化完成时,会提示如下信息:1
2
3
4
5
6
7
8To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
as root:
kubeadm join --token b99a00.a144ef80536d4344 192.168.0.169:6443 --discovery-token-ca-cert-hash sha256:ebc2f64e9bcb14639f26db90288b988c90efc43828829c557b6b66bbe6d68dfa
其中kubeadm join是为后期新的node加入集群时使用的,在公司生产上的集群部署好时此命令没有保存,且token时有实效性的。后期有node加入集群,join命令的两个参数可以在master节点上通过如下命令获取:
token:1
2
3root@yksp009027:~# kubeadm token list
TOKEN TTL EXPIRES USAGES DESCRIPTION EXTRA GROUPS
b97h00.a144ef08526d4345 <forever> <never> authentication,signing The default bootstrap token generated by 'kubeadm init'. system:bootstrappers:kubeadm:default-node-token
hash:
1 | openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //' |
然后在新node上执行:
1 | kubeadm join --token=$TOKEN $MASTER_IP:6443 --discovery-token-ca-cert-hash sha256:$HASH |
查看node,kubectl get nodes新node已进入Ready状态。(在join前请保证node上安装好kubelet、docker、kubeadm、kubernetes-cni、socat,并启动kubelet、docker,参考上方步骤)