前置知识点
(1) kubeadm
kubeadm 是一个 k8s 部署工具,提供 kubeadm init 和 kubeadm join,用于快速部署 kubernetes 集群。
(2)二进制包
从 GitHub 下载发行版的二进制包,手动部署每个组件,组成 kubernetes 集群。
Kubeadm 降低部署门槛。单屏蔽了很多细节,遇到问题很难排查。如果想更容易可控,推荐使用为禁止包部署 Kubernetes 集群,虽然手动部署麻烦点,期间可以学习很多工作原理,利于后期维护。
1、基于集群部署工具 kubeadm
kubeadm 是官方社区推出的一个用于快速部署 kubernetes 集群工具,这个工具能通过两条指令完成一个 kubernetes 集群的部署:
- 创建一个 master 节点 kubeadm init
- 将 node 节点加入到当前集群中 kubeadm join <master 节点的 ip 和端口>
步骤:
- 安装三台虚拟机,安装操作系统centos7.*
- 对三个安装之后的操作系统进行初始化操作
- 在三个节点安装 docker kubelet kubeadm kubectl
- 在 master 节点执行 kubeadm init 命令进行初始化
- 在 node 节点上执行 kubeadm join 命令把 node 节点添加到当前群里面
- 配置网络插件
1.1、环境准备
关闭防火墙:
$ systemctl stop firewalld
$ systemctl disable firewalld
# 关闭selinux
$ sed -i 's/enforcing/disabled/' /etc/selinux/config // 永久
$ setenforce 0 // 临时
# 关闭 swap
$ swapoff -a // 临时
$ sed -ri 's/.*swap.*/#&/' /etc/fstab // 永久
# 根据规划设置主机名
$ hostnamectl set-hostname <hostname>
# 在 master 添加 hosts
$ cat > /etc/hosts << EOF
192.1.**.** master
192.1.**.** node1
192.1.**.** node2
EOF
# 将桥接的 ipv4 流量传递到 iptables 的链,所有机器都设置
$ cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system // 生效
# 时间同步
$ yum install ntpdate -y
$ ntpdate time.windows.com
1.2、所有节点安装 Docker、kubeadm、kubelet
kubernetes 默认 CRI (容器运行时)为 Docker,因此先安装 Docker。
1.2.1、安装 Docker
$ wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O
/etc/yum.repos.d/docker-ce.repo
$ yum -y install docker-ce-18.06.1.ce-2.e17
$ systemctl enable docker && systemctl start docker
$ docker --version
$ Docker version 18.06.1-ce. build e68fc7a
$ cat > /etc/docker/daemon.json << EOF
{
'registry-mirrors': ['https://<阿里云申请ID>.mirror.aliyuncs.com']
}
EOF
1.2.2、添加阿里云YUM软件源
$ cat > /etc/tum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-e17-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/tum/doc/yum-key.gpg
https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
1.2.3、安装 kubeadm、kubelet 和 kubectl
由于版本更新频繁,这里指定版本安装
$ yum install -y kubelet-1.17.0 kubeadm-1.18.0 kubectl-1.18.0
$ systemctl enable kubelet
1.2.4、部署 kubernetes master
在 master 机器上执行
$ kubeadm init --apiserver-advertise-address=192.168.1.*** --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.18.0 --service-cidr=10.96.0.0/12 --pod-network-cidr=10.244.0.0/16
--apiserver-advertise-address=192.168.1.*** \ // 当前节点 ip
--kubernetes-version v1.18.0 \ // 当前版本
--service-cidr=10.96.0.0/12 \ //kube-proxy 的 ip 随便定、只要跟当前 ip 不冲突就行
--pod-network-cidr=10.244.0.0/16 // 每个容器的 ip 随便定、只要跟当前 ip 不冲突就行
由于默认拉取镜像地址 k8s.gcr.io 国内无法访问,这里指定阿里云镜像仓库地址。
根据输出提示操作:
$ mkdir -p $HOME/.kube
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ sudo chown ${id -u}:${id -g} $HOME/.kube/config
$ kubectl get nodes
1.2.5、加入 kubernetes node
在 node 机器上执行
向集群添加新节点,执行 kubernetes init 输出的 kubeadm join 命令:
// 在master机器中获取,执行 2.4 中命令后
$ kubeadm join 192.168.**.**:port --token esce21.q6hetwm8si29qxwn \
--discovery-token-ca-cert-hash
sha256:0066..................................................
默认 token 有效期为 24 小时,当过期之后,该 token 就不可用了。这时就需要重新创建 token,操作如下:
$ kubeadm token create --print-join-command
1.2.6、部署 CNI 网络插件
$ wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
默认镜像地址无法访问,sed 命令修改为 docker hub 镜像仓库。
// master 节点
$ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
// 查看 pod 状态
kubectl get pods -n kube-system
NAME READY STATUS RESTART AGE
kube-flannel-ds-amd64-2pc95 1/1 Running 0 72s
1.2.7、测试 kubernetes 集群
在 kubernetes 集群中创建一个 pod,验证是否正常运行
// master 机器
$ kubectl create deployment nginx --image=nginx
$ kubectl expose deployment nginx --port=80 --type=NodePort
// 查看暴露端口号
$ kubectl get pod,svc
访问地址:http://NodeIP:Port
2、基于二进制包方式
步骤:
- 创建多台虚拟机,安装 linux 操作系统
- 操作系统初始化(同 1.1、环境准备)
- 为 etcd 和 apiserver 自签证书
- 部署 etcd 集群
- 部署 master 组件(kube-apisever、kube-controller-manager、kube-scheduler、etcd)
- 部署 node 组件(kubelet、kube-proxy、docker、etcd)
- 部署网络插件