运维技术点
运维技术点
当Kubernetes 1.20开始准备弃用Docker,相信很多人在k8s 1.20版本出现的时候,都听说了即将弃用docker,不过还没有完全弃用,但这也是未来的趋势了。k8s的底层还是容器。
具体使用docker和弃用docker的前因后果我就不多说了,本文只是为了使用docker以外的CRI(Container Runtime Interface)来部署Kubernetes。这里就进行单机部署了。
建议使用CentOS 7.5版本以上,这里以7.6为例,配置好网络,可以访问外网。
当弃用docker后,可以直接使用containerd来做CRI。
修改主机名
sed -i '$a\192.168.1.80 test' /etc/hosts hostnamectl set-hostname test
关闭selinux&firewalld
systemctl stop firewalld && systemctl disable firewalld setenforce 0 sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/g' /etc/selinux/config
关闭swap
swapoff -a sed -i 's/^[^#].*swap*/#&/g' /etc/fstab
安装依赖及常用工具
yum install -y yum-utils device-mapper-persistent-data lvm2 wget vim yum-utils net-tools epel-release
添加加载的内核模块
cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf overlay br_netfilter EOF
加载内核模块
modprobe overlay modprobe br_netfilter
设置内核参数
cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 net.bridge.bridge-nf-call-ip6tables = 1 EOF
应用内核参数
sysctl --system
添加docker源
containerd也是在docker源内的。
国外docker源
yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo
阿里云源
cat <<EOF | sudo tee /etc/yum.repos.d/docker-ce.repo [docker] name=docker-ce baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/stable/ enabled=1 gpgcheck=1 gpgkey=https://mirrors.aliyun.com/docker-ce/linux/centos/gpg EOF
安装containerd
yum -y update && yum -y install containerd.io # 指定版本使用containerd.io-x.x.x # 需要升级系统则yum -y update
配置containerd
默认是没有配置文件的,可以像k8s一样获取到一些默认配置。
mkdir -p /etc/containerd containerd config default | sudo tee /etc/containerd/config.toml
修改cgroup Driver为systemd。
在配置文件中如下位置添加SystemdCgroup = true。
sed -i '/runc.options/a\ SystemdCgroup = true' \ /etc/containerd/config.toml && \ grep 'SystemdCgroup = true' -B 7 /etc/containerd/config.toml
镜像加速
endpoint位置添加阿里云的镜像源:
$ vim /etc/containerd/config.toml [plugins."io.containerd.grpc.v1.cri".registry] [plugins."io.containerd.grpc.v1.cri".registry.mirrors] [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"] endpoint = ["https://xxxxxxxx.mirror.aliyuncs.com" ,"https://registry-1.docker.io"]
更改sandbox_image:
$ vim /etc/containerd/config.toml ... [plugins."io.containerd.grpc.v1.cri"] disable_tcp_service = true stream_server_address = "127.0.0.1" stream_server_port = "0" stream_idle_timeout = "4h0m0s" enable_selinux = false selinux_category_range = 1024 # 将这里改为aliyun的镜像源 sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.2" ...
启动服务
systemctl enable containerd && systemctl start containerd
如果你的环境中网络代理去访问外网,containerd也需要单独添加代理:
mkdir /etc/systemd/system/containerd.service.d cat > /etc/systemd/system/containerd.service.d/http_proxy.conf << EOF [Service] Environment="HTTP_PROXY=http://<proxy_ip>:<proxy_port>/" Environment="HTTPS_PROXY=http://<proxy_ip>:<proxy_port>/" Environment="NO_PROXY=x.x.x.x,x.x.x.x" EOF
加载配置并重启服务:
systemctl daemon-reload && systemctl restart containerd
下载镜像检测containerd是否正常:
ctr images pull docker.io/library/nginx:alpine
ctr是containerd自带的命令行客户端。
添加kubernetes源
原Kubernetes源:
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-\$basearch enabled=1 gpgcheck=1 repo_gpgcheck=1 gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg exclude=kubelet kubeadm kubectl EOF yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes # 如果指定版本使用kubeadm-x.x.x # 因为这里使用的就是准备弃用docker的版本,按最新版本安装即可
阿里云源:
cat << EOF >> /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ enabled=1 gpgcheck=1 repo_gpgcheck=1 gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg EOF yum -y install kubeadm kubectl kubelet # 如果指定版本使用kubeadm-x.x.x # 因为这里使用的就是准备弃用docker的版本,按最新版本安装即可
启动并设置开机自启
systemctl enable --now kubelet
命令补齐
yum -y install bash-completion vim .bashrc # 末尾添加 source <(kubeadm completion bash) source <(kubectl completion bash) source .bashrc
使用除docke以外的CRI时,需要使用crictl来进行镜像管理,相当于docker-cli。
Containerd只支持通过CRI拉取镜像的mirror,也就是说,只有通过crictl或者Kubernetes调用时mirror才会生效,通过ctr拉取是不会生效的。crictl是k8s内部的镜像管理命令。
cat << EOF >> /etc/crictl.yaml runtime-endpoint: unix:///var/run/containerd/containerd.sock image-endpoint: unix:///var/run/containerd/containerd.sock timeout: 10 debug: false EOF
下载镜像
crictl pull nginx:latest
crictl基本上与docker用法一致。
导出默认init文件
kubeadm config print init-defaults > kubeadm-init.yaml
修改文件
apiVersion: kubeadm.k8s.io/v1beta2 bootstrapTokens: - groups: - system:bootstrappers:kubeadm:default-node-token token: abcdef.0123456789abcdef ttl: 24h0m0s usages: - signing - authentication kind: InitConfiguration localAPIEndpoint: advertiseAddress: 192.168.1.80 # 修改为本机地址 bindPort: 6443 # apiserver端口号 nodeRegistration: criSocket: /var/run/containerd/containerd.sock # 修改为containerd的sock文件位置 name: test taints: - effect: NoSchedule key: node-role.kubernetes.io/master --- apiServer: certSANs: # apiserver下添加certSANs字段,并填写集群中所有节点的hostname、ip以及VIP - test - 192.168.1.80 timeoutForControlPlane: 4m0s controlPlaneEndpoint: "192.168.1.80:6443" # 控制平面apiserver IP及端口号 apiVersion: kubeadm.k8s.io/v1beta2 certificatesDir: /etc/kubernetes/pki clusterName: kubernetes controllerManager: {} dns: type: CoreDNS etcd: local: dataDir: /var/lib/etcd imageRepository: k8s.gcr.io # 如果使用阿里云可以修改为registry.aliyuncs.com/google_containers kind: ClusterConfiguration kubernetesVersion: v1.20.5 # kubernetes版本号 查看自己当时的版本 kubeadm version 命令查看 networking: dnsDomain: cluster.local serviceSubnet: 10.96.0.0/12 podSubnet: "10.16.0.0/16" # 即将安装网络插件的ip网段 flannel网段:"10.244.0.0/16" scheduler: {} # 使用除docker外的CRI需要指定cgroupDriver --- apiVersion: kubelet.config.k8s.io/v1beta1 kind: KubeletConfiguration cgroupDriver: systemd
预下载镜像
kubeadm config images pull --config=kubeadm-init.yaml
初始化
kubeadm init --config=kubeadm-init.yaml --upload-certs
设置kubectl默认访问的api
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
查看CRI是否是containerd
[root@test ~]# kubectl get nodes -o wide NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME test NotReady control-plane,master 10m v1.20.5 192.168.1.80 <none> CentOS Linux 7 (Core) 3.10.0-1160.21.1.el7.x86_64 containerd://1.4.4
根据自己的需要部署网络插件
推荐阅读
>>>新手必备-Linux系统安装配置+Xshell远程连接
运维界升职加薪必备的云计算技术,你学了吗?
学完高级运维云计算课程之后,你可以:
跨越90%企业的招聘硬门槛
增加70%就业机会
拿下BAT全国TOP100大厂敲门砖
体系化得到运维技术硬实力
技术大佬年薪可达30w+