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