说明
仅记录我的部署流程,不一定满足各种需求!
如无说明,均使用root用户操作!
服务器信息
主机名 | IP地址 | 角色 | 操作系统 | Containerd版本 | k8s版本 |
---|---|---|---|---|---|
k8s-master | 172.16.80.100 | master+node | Ubuntu 20.04.3 LTS | 1.5.2-0ubuntu1~20.04.3 | v1.20.11 |
k8s-node1 | 172.16.80.101 | node | Ubuntu 20.04.3 LTS | 1.5.2-0ubuntu1~20.04.3 | v1.20.11 |
k8s-node2 | 172.16.80.102 | node | Ubuntu 20.04.3 LTS | 1.5.2-0ubuntu1~20.04.3 | v1.20.11 |
服务器初始化
添加sysctl
1 | cat > /etc/sysctl.d/99-k8s.conf <<EOF |
修改limits参数
1 | cat > /etc/security/limits.d/99-k8s.conf <<EOF |
修改journal设置
1 | sed -e 's,^#Compress=yes,Compress=yes,' \ |
配置rsyslog
1 | sed -r \ |
打开logrotate压缩
1 | sed -e 's,^#compress,compress,' -i.bak /etc/logrotate.conf |
卸载snapd
1 | systemctl stop snapd |
刷新APT缓存
1 | apt update |
更新系统软件
1 | apt upgrade |
安装常用软件
1 | apt install -qyy \ |
配置网络
- Ubuntu 20.04 LTS 使用netplan来管理网络配置,可以使用
NetworkManager
或者Systemd-networkd
的网络守护程序来做为内核的接口。 - 如果再通过原来的
ifupdown
工具包继续在/etc/network/interfaces
文件里配置管理网络接口是无效的。 默认的
systemd-resolve
会接管/etc/resolv.conf
,无法直接修改,并且会监听localhost:53
端口,看着非常不爽。修改过程如下网卡配置文件路径
/etc/netplan/00-installer-config.yaml
,配置文件的样例在这里
1 | network: |
- 使用netplan命令让配置生效
1 | netplan apply |
这时候会发现,
/etc/resolv.conf
里面的nameserver指向127.0.0.53并且是软链接到
/run/systemd/resolve/stub-resolv.conf
内容如下
1 | nameserver 127.0.0.53 |
- 修改systemd-resolv的配置文件
/etc/systemd/resolved.conf
1 | [Resolve] |
- 重启systemd-resolv服务
1 | systemctl restart systemd-resolved.service |
- 修改
/etc/resolv.conf
软链接指向
1 | ln -svf /run/systemd/resolve/resolv.conf /etc/resolv.conf |
- 现在再看
/etc/resolv.conf
的内容就舒服了
1 | nameserver 114.114.114.114 |
修改时区
1 | timedatectl set-timezone Asia/Shanghai |
配置时间同步
- Ubuntu 20.04 LTS 使用
systemd-timesyncd
实现跨网络同步系统时钟的守护服务,与NTP的复杂实现相比,这个服务简单的多,它只专注于从远程服务器查询然后同步到本地时钟。 - 守护进程运行只需要尽可能小特权,并且会跟网络服务 networkd 挂钩,仅在网络连接可用时才工作。
- 配置文件路径
/etc/systemd/timesyncd.conf
1 | sed -e 's,^#NTP=.*,NTP=cn.pool.ntp.org,' -i /etc/systemd/timesyncd.conf |
- 重启systemd-timesyncd服务
1 | systemctl restart systemd-timesyncd.service |
修改LANG默认值
1 | localectl set-locale LANG=en_US.UTF-8 |
配置/etc/hosts
1 | 127.0.0.1 localhost |
禁用终端欢迎消息广告
- 关闭获取Ubuntu新闻
1 | sed -e 's,^ENABLED=1,ENABLED=0,g' -i /etc/default/motd-news |
- 关闭动态motd不需要的内容
1 | chmod -x /etc/update-motd.d/80-livepatch |
禁用swap分区
1 | swapoff -a |
配置内核模块
1 | cat > /etc/modules-load.d/k8s.conf <<EOF |
kubernetes集群环境准备
添加APT源
使用阿里云的kubernetes源
1 | curl -sSL https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add - |
安装k8s软件包
1 | apt-get update |
添加命令补全
- 临时生效
1 | source <(crictl completion) |
- 永久生效
1 | crictl completion > /etc/bash_completion.d/crictl |
Containerd
再次声明!
containerd的版本是
1.5.2-0ubuntu1~20.04.3
,1.5.2之前的版本不一定能用!
修改crictl配置
1 | crictl config runtime-endpoint /run/containerd/containerd.sock |
生成containerd配置
1 | mkdir -p /etc/containerd |
修改containerd配置
1 | vim /etc/containerd/config.toml |
pause镜像地址
[plugins."io.containerd.grpc.v1.cri"]
配置项
sandbox_image = "k8s.gcr.io/pause:3.5"
修改为sandbox_image = "registry.aliyuncs.com/k8sxio/pause:3.5"
cgroups
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
配置项
SystemdCgroup = false
修改为SystemdCgroup = true
docker.io国内镜像地址
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
底下追加两行
1 | [plugins."io.containerd.grpc.v1.cri".registry.mirrors] |
k8s.gcr.io国内镜像地址
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
底下再追加两行,不过好像不生效
1 | [plugins."io.containerd.grpc.v1.cri".registry.mirrors] |
直接sed生成
1 | mkdir -p /etc/containerd |
配置文件全文
/etc/containerd/config.toml
1 | disabled_plugins = [] |
重启Containerd
1 | systemctl enable containerd.service |
验证配置生效
1 | crictl info | jq '.config.containerd.runtimes.runc.options.SystemdCgroup' |
kubeadm初始化
生成kubeadm配置文件
1 | kubeadm config print init-defaults > kubeadm-init.yaml |
修改配置文件
修改之后如下文所示
1 | apiVersion: kubeadm.k8s.io/v1beta2 |
初始化集群
- 检查一下是否报错
1 | kubeadm init --config=kubeadm-init.yaml --dry-run |
- 先拉取镜像
1 | for img in $(kubeadm config --config=kubeadm-init.yaml images list | xargs);do |
- 初始化k8s集群
1 | kubeadm init --config=kubeadm-init.yaml |
集群初始化完成之后,会给出kubeadm join命令,用于node节点加入集群
1 | Your Kubernetes control-plane has initialized successfully! |
配置kubeconfig
1 | mkdir -p $HOME/.kube |
设置master可调度
1 | kubectl taint node --all node-role.kubernetes.io/master- |
添加CNI插件
只需要装一个即可,同时装多个会出问题的!
kube-flannel
要用
kube-flannel
的话,kubeadm-init.yaml
需要声明networking.podSubnet=10.244.0.0/16
1 | kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml |
Calico
calico默认的
podCIDR
是192.168.0.0/16
,kubeadm-init.yaml
需要声明networking.podSubnet=192.168.0.0/16
- 安装operator
1 | kubectl create -f https://docs.projectcalico.org/manifests/tigera-operator.yaml |
- 部署CRD
1 | kubectl apply -f https://docs.projectcalico.org/manifests/custom-resources.yaml |
Cilium
- 下载
1 | curl -L --remote-name-all https://github.com/cilium/cilium-cli/releases/latest/download/cilium-linux-amd64.tar.gz{,.sha256sum} |
- 安装
1 | cilium install |
- 验证
1 | cilium status --wait |
添加node节点
- 完成服务器初始化
- 安装Kubernetes软件包和containerd
- 配置containerd
- 添加到集群,这里执行初始化集群成功之后输出的
kubeadm join
命令
1 | kubeadm join 172.16.80.100:6443 --token wyoi59.me7ajasf4ilcmpgh \ |
获取节点状态
1 | kubectl get node -o wide |
节点状态如下
1 | NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME |