ubuntu18.04.1 搭建kubernetes1.15.0集群(2019.07.10亲测)
-
VMware生成三台虚拟机
$ uname -a Linux k8s-node1 4.18.0-15-generic #16~18.04.1-Ubuntu SMP Thu Feb 7 14:06:04 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
-
准备工作
2.1. 安装基本工具$ sudo apt update && \ sudo apt -y upgrade && \ sudo apt install -y vim \ curl \ apt-transport-https \ ca-certificates \ software-properties-common
2.2. 更换dns管理服务
$ sudo apt install -y unbound $ sudo systemctl stop systemd-resolved $ sudo systemctl disable systemd-resolved $ sudo rm -rf /etc/resolv.conf $ sudo vim /etc/NetworkManager/NetworkManager.conf # 在[main]下面添加 dns=unbound # 重启生效 $ reboot
tips: 系统自带的systemd-resolved服务会将/etc/resolv.conf软链接到/run/systemd/resolv/stub-resolv.conf,并在里面写入localloop地址。而coredns会读取/etc/resolv.conf文件中的dns服务器地址,如果读到的是localloop,那么coredns会启动失败。当然有很多种方法来解决这个问题,这里采用禁用systemd-resolved,更换为unbound来管理dns服务
2.2. 修改主机名
# 按照自己的命名喜好,我的叫k8s-nodeX # 分别在三台机器上修改名字 $ sudo hostnamectl set-hostname k8s-node1
2.3. 修改/etc/sysctl.conf,配置数据包转发
$ sudo vim /etc/sysctl.conf net.ipv4.ip_forward = 1 net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1
使配置生效(但是reboot之后会自动失效)
$ sudo modprobe br_netfilter $ sudo sysctl -p
设置开机自动载入br_netfilter
$ sudo vim /etc/init.d/load_br_netfilter.sh #!/bin/bash ### BEGIN INIT INFO # Provides: svnd.sh # Required-Start: $local_fs $remote_fs $network $syslog # Required-Stop: $local_fs $remote_fs $network $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: starts the svnd.sh daemon # Description: starts svnd.sh using start-stop-daemon ### END INIT INFO sudo modprobe br_netfilter $ sudo chmod 775 /etc/init.d/load_br_netfilter.sh $ sudo update-rc.d load_br_netfilter.sh defaults 90 # 如果要取消开机自动载入模块 $ sudo update-rc.d -f load_br_netfilter.sh remove
2.4. 禁用swap
$ sudo swapoff -a
设置swap开机不启动
$ sudo vim /etc/fstab # 注释掉swapfile这一行
2.5. 关闭防火墙
$ sudo ufw disable
2.6. 禁用selinux
$ sudo vim /etc/selinux/config SELINUX=disabled
2.7. 安装docker 18.06.3-ce
# 卸载旧版本的docker $ sudo apt remove docker docker-engine docker.io # 添加GPG key,用阿里云的 $ curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add - # 添加镜像,用阿里云的 $ sudo add-apt-repository \ "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu \ $(lsb_release -cs) \ stable" # 查看可用的docker版本 $ apt-cache madison docker-ce # 安装docker $ sudo apt install -y docker-ce=18.06.3~ce~3-0~ubuntu # 设置开机启动 $ sudo systemctl enable docker && sudo systemctl start docker # 将当前用户加入docker组 $ sudo usermod -aG docker $(whoami) # 切换组 $ newgrp docker
2.8. 配置docker
$ sudo vim /etc/docker/daemon.json { "log-driver":"json-file", "log-opts":{ "max-size":"100m" }, "storage-driver":"overlay2" }
-
安装kubeadm, kubectl, kubelet
3.1. 配置源$ sudo curl -s https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add - $ sudo tee /etc/apt/sources.list.d/kubernetes.list <<-'EOF' deb https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial main EOF $ sudo apt update
3.2. 查看可用版本
$ apt-cache madison kubeadm
3.3. 安装指定版本
$ sudo apt install -y kubelet=1.15.0-00 kubeadm=1.15.0-00 kubectl=1.15.0-00 $ sudo apt-mark hold kubelet=1.15.0-00 kubeadm=1.15.0-00 kubectl=1.15.0-00
3.4. 设置开机启动
$ sudo systemctl enable kubelet && sudo systemctl start kubelet
-
启动集群
4.1. 启动master节点$ kubeadm init --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.15.0 --pod-network-cidr=10.244.0.0/16
tips:因为我们后面用的cni是flannel,所以这里网段要写10.244.0.0/16,和flannel的yaml文件中的配置保持一致,不然集群内部的数据转发会有问题。
如果启动成功,则会得到类似下面信息
kubeadm join 192.168.117.132:6443 --token ozbspb.7m5ux5qrzuhjw2ja \ --discovery-token-ca-cert-hash sha256:ac17927e2c27730292dffb7719fb4ea0349bda3ed04d0c7e88eee98dfed2783c
记下这些信息,需要在从节点上执行这条命令来加入集群
tips: token默认有效期为24小时,如果失效了则执行下面命令重新生成token
$ kubeadm token create --print-join-command
4.2. 检查kubelet使用的driver是否和docker的一致
tips:我这里用的是默认的cgroup,不过貌似官方推荐用systemd,如果需要手动更改的,参考:https://kubernetes.io/docs/setup/cri/
查看docker的driver
$ docker info | grep -i cgroup
查看kubelet的driver
$ sudo cat /var/lib/kubelet/kubeadm-flags.env
4.3. 创建kubectl的配置文件
$ mkdir -p $HOME/.kube $ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config $ sudo chown $(id -u):$(id -g) $HOME/.kube/config
4.4. 安装CNI flannel
tips:不同cni的选择,参考:https://kubernetes.io/docs/concepts/cluster-administration/addons/
$ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/a70459be0084506e4ec919aa1c114638878db11b/Documentation/kube-flannel.yml
4.5. pod默认是不会被调度到master节点的,如果需要master节点也能被调度到,则需要去除master节点上面自带的taint
$ kubectl taint nodes $(MASTER_NODE_HOST_NAME) node-role.kubernetes.io/master:NoSchedule-
-
slave节点加入集群
# 从节点上执行命令加入集群,如果token过期了,需要重新生成 $ kubeadm join 192.168.117.132:6443 --token ozbspb.7m5ux5qrzuhjw2ja \ --discovery-token-ca-cert-hash sha256:ac17927e2c27730292dffb7719fb4ea0349bda3ed04d0c7e88eee98dfed2783c
-
查看相关信息
# 查看default namespace中nodes信息 $ kubectl get nodes # 查看default namespace中pod信息 $ kubectl get pods # 查看集群系统信息 $ kubectl -n kube-system get pod # 更改配置 $ kubectl -n kube-system edit cm
-
安装nfs
k8s中数据持久化方式有很多种,比如emptyDir,hostPath,还有各云服务商提供的网络存储方案。这里就简单的采用nfs,将各个容器中的数据持久化在nfs服务器上# 每台服务器都执行下面命令安装nfs $ sudo apt install nfs-kernel-server, nfs-common # $sharedDir是你要共享的目录 # rw表示可读可写 # no_root_squash表示root用户具有完全管理权限 # async表示数据暂存在内存中,先不写入磁盘,可以提高性能 $ sudo vim /etc/exports $sharedDir *(rw,no_root_squash,async) $ sudo systemctl start rpcbind.service $ sudo systemctl start nfs.service