1.系统配置
- 硬件配置基本要求
资源 | 大小 |
硬盘 | >= 20G |
cpu | >= 2核 |
内存 | >= 2G |
- 本教程配置
主机名 | IP | 配置 |
master | 192.168.10.155 | 3核+2G+20G |
worker1 | 192.168.10.234 | 3核+2G+20G |
worker2 | 192.168.10.147 | 3核+2G+20G |
2.安装必要软件
所有机器都要执行
yum 更新
sudo yum update -y
- bash-completion: tab命令补全
- wget:下载工具
- vim-enhanced:vim编辑器
- net-tools:网络工具
- gcc: 编译器
sudo yum install -y bash-completion wget vim-enhanced net-tools gcc
3.设置主机名
- 查看主机名
hostname
- 设置主机名
以下三条命令分别在三个节点执行
#master节点 hostnamectl set-hostname k8s-master #worker1节点 hostnamectl set-hostname k8s-worker1 #woker2节点 hostnamectl set-hostname k8s-worker2
4.配置hosts文件
将节点加入到 hosts 文件中
编辑/etc/hosts
文件
vi /etc/hosts
添加以下内容
192.168.10.155 k8s-master 192.168.10.234 k8s-worker1 192.168.10.147 k8s-worker2
5.设置时间同步
sudo yum -y install ntpdate sudo ntpdate ntp1.aliyun.com sudo systemctl status ntpdate sudo systemctl start ntpdate sudo systemctl status ntpdate sudo systemctl enable ntpdate
6.关闭防火墙或者开通指定端口
这里使用关闭防火墙
sudo systemctl stop firewalld.service sudo systemctl disable firewalld.service
7.关闭 swap 交换空间
#查看 free -h #临时关闭swap sudo swapoff -a #久关闭swap分区 sudo sed -i 's/.*swap.*/#&/' /etc/fstab
8.关闭selinux
#查看 getenforce cat /etc/selinux/config #临时关闭 sudo setenforce 0 #永久关闭 sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
9. 安装 docker, Containerd
- 安装 docker, Containerd
# 删除 docker(如果有的话) sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine # 安装必备工具 sudo yum install -y yum-utils device-mapper-persistent-data lvm2 # 加入 docker 源 sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo # 安装 docker sudo yum install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin # 安装 containerd sudo yum install -y containerd
- 配置
# 停止 containerd sudo systemctl stop containerd.service # 生成并修改配置文件 sudo cp /etc/containerd/config.toml /etc/containerd/config.toml.bak sudo containerd config default > $HOME/config.toml sudo cp $HOME/config.toml /etc/containerd/config.toml sudo sed -i "s#registry.k8s.io/pause#registry.cn-hangzhou.aliyuncs.com/google_containers/pause#g" /etc/containerd/config.toml sudo sed -i "s#SystemdCgroup = false#SystemdCgroup = true#g" /etc/containerd/config.toml # 将 containerd 加入开机自启 sudo systemctl enable --now containerd.service # 启动 docker sudo systemctl start docker.service # 将 docker 加入开机自启 sudo systemctl enable docker.service sudo systemctl enable docker.socket sudo systemctl list-unit-files | grep docker sudo systemctl daemon-reload sudo systemctl restart docker sudo docker info sudo systemctl status docker.service sudo systemctl status containerd.service
10.添加阿里云 k8s 镜像仓库
添加/etc/yum.repos.d/kubernetes.repo
文件;文件内容如下
[kubernetes] name=Kubernetes baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ # 是否开启本仓库 enabled=1 # 是否检查 gpg 签名文件 gpgcheck=0 # 是否检查 gpg 签名文件 repo_gpgcheck=0 gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
11.设置 docker 镜像加速
sudo mkdir -p /etc/docker vi /etc/docker/daemon.json
/etc/docker/daemon.json
文件添加如下内容
{ "registry-mirrors": [ "https://dockerproxy.com", "https://hub-mirror.c.163.com", "https://mirror.baidubce.com", "https://ccr.ccs.tencentyun.com" ], "exec-opts": ["native.cgroupdriver=systemd"] }
12. 将桥接的IPv4流量传递到iptables的链
cat >/etc/modules-load.d/k8s.conf <<EOF overlay br_netfilter EOF modprobe overlay modprobe br_netfilter cat >/etc/sysctl.d/k8s.conf <<EOF net.bridge.bridge-nf-call-iptables=1 net.bridge.bridge-nf-call-ip6tables=1 net.ipv4.ip_forward=1 EOF sysctl --system # 通过运行以下指令确认br_netfilter和overlay模块被加载 lsmod | egrep 'overlay|br_netfilter' # 通过运行以下指令确认net.bridge.bridge-nf-call-iptables、net.bridge.bridge-nf-call-ip6tables系统变量在你的sysctl配置中被设置为1 sysctl net.bridge.bridge-nf-call-iptables net.bridge.bridge-nf-call-ip6tables net.ipv4.ip_forward
13.安装k8s
# 安装 1.27.1 版本 sudo yum install -y kubelet-1.27.1-0 kubeadm-1.27.1-0 kubectl-1.27.1-0 --disableexcludes=kubernetes --nogpgcheck systemctl daemon-reload sudo systemctl restart kubelet sudo systemctl enable kubelet
安装最新版本(生产环境不建议)
sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes --nogpgcheck
14.k8s配置
- master 初始化(仅在master节点主机上执行)
kubeadm init --image-repository=registry.aliyuncs.com/google_containers --apiserver-advertise-address=192.168.42.150 --kubernetes-version=v1.27.1
--image-repository
: 镜像加速地址,一般不动
--apiserver-advertise-address
: master节点IP地址
--kubernetes-version
: kubernetes版本,自己选择的什么版本就改成什么版本
初始化失败可以使用kubeadm reset
重置;失败原因多半是因为网络问题,可以换个网络试试
- 初始化成功后执行(仅在master节点主机上执行)
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
- 将 node 加入集群(仅在node节点主句执行)
kubeadm init
命令执行成功后,会打印以下内容 (不要直接复制,每个人不一样):
kubeadm join 192.168.10.155:6443 --token pn5997.vkugw8cmdpc407y2 \ --discovery-token-ca-cert-hash sha256:b625d6be2a3ccb56f3277e835b343d33a0b2e93e56e238a48daf830d3b7219f2
如果忘记或者过期可以使用以下命令重新生成
kubeadm token create --print-join-command
- 查看集群状态(master 节点执行)
kubectl get nodes
输出
NAME STATUS ROLES AGE VERSION k8s-master NotReady control-plane 8m42s v1.27.1 k8s-worker1 NotReady <none> 82s v1.27.1 k8s-worker2 NotReady <none> 84s v1.27.1
可以看到所有节点都是 NotReady ,是因为还没有配置网络
- 配置网络(仅在master节点执行)
k8s版本要与Calico版本对应上,具体查看
https://docs.tigera.io/calico/latest/getting-started/kubernetes/requirements
下载calico.yaml
文件
wget --no-check-certificate https://projectcalico.docs.tigera.io/archive/v3.25/manifests/calico.yaml
修改calico.yaml
文件
在- name: CLUSTER_TYPE
下方添加如下内容
- name: CLUSTER_TYPE value: "k8s,bgp" #下方为新增内容 - name: IP_AUTODETECTION_METHOD value: "interface=master节点主机的网卡名称"
配置网络
kubectl apply -f calico.yaml
再次查看节点信息
kubectl get nodes
依然还是没有成功;查看 pod 状态,没有正常启动
kubectl get pods --all-namespaces -o wide | grep kube-system
使用crictl logs
命令查看任何一个pod,发现有如下错误
crictl logs coredns-7bdc4cb885-28jnf
kubectl logs -n kube-system
命令查看状态不是running的pod,发现有如下错误
kubectl logs -n kube-system calico-node-bfxtk kubectl logs -n kube-system coredns-7bdc4cb885-28jnf
新建/etc/crictl.yaml
文件,写入如下内容
runtime-endpoint: unix:///run/containerd/containerd.sock image-endpoint: unix:///run/containerd/containerd.sock timeout: 10 debug: false
使用kubectl delete pod -n kube-system
命令删除那些状态不是running的pod。例如
kubectl delete pod -n kube-system calico-kube-controllers-6c99c8747f-kmkdl
再次查看pod的启动状态,全部都是在running状态
kubectl get pod -n kube-system
另外crictl ps
也可以使用了。
crictl ps -a
使用crictl logs
也可以查看日志了
crictl logs 4838afe83150e
15.其他
- k8s命令补全
! grep -q kubectl "$HOME/.bashrc" && echo "source /usr/share/bash-completion/bash_completion" >>"$HOME/.bashrc" ! grep -q kubectl "$HOME/.bashrc" && echo "source <(kubectl completion bash)" >>"$HOME/.bashrc" ! grep -q kubeadm "$HOME/.bashrc" && echo "source <(kubeadm completion bash)" >>"$HOME/.bashrc" ! grep -q crictl "$HOME/.bashrc" && echo "source <(crictl completion bash)" >>"$HOME/.bashrc" source "$HOME/.bashrc"
- 常用命令
# 获取节点 kubectl get nodes -o wide # 实时查询nodes状态 watch kubectl get nodes -o wide # 获取pod kubectl get pods --all-namespaces -o wide # 查看镜像列表 kubeadm config images list # 节点加入集群 kubeadm token create --print-join-command # 描述node kubectl describe node k8s-master # 描述pod kubectl describe pod kube-flannel-ds-hs8bq --namespace=kube-system
16.测试
以下命令在主节点执行
- 创建一个 nginx
kubectl create deployment nginx --image=nginx
- 查看状态
kubectl get pods -o wide
等待ContainerCreating
变成Running
后执行下一个步骤
- 暴露端口
kubectl expose deployment nginx --port=80 --type=NodePort
- 查看 pos 及服务信息
kubectl get pod,svc
- 在浏览器中访问
http://192.168.10.155:31930/
地址根据你自己的主机变化,端口上面输出的信息中 PORT(S) 这一栏会有