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-master192.168.10.234 k8s-worker1192.168.10.147 k8s-worker2
5.设置时间同步
sudo yum -y install ntpdatesudo ntpdate ntp1.aliyun.comsudo systemctl status ntpdatesudo systemctl start ntpdatesudo systemctl status ntpdatesudo systemctl enable ntpdate
6.关闭防火墙或者开通指定端口
这里使用关闭防火墙
sudo systemctl stop firewalld.service sudo systemctl disable firewalld.service
7.关闭 swap 交换空间
#查看free -h#临时关闭swapsudo swapoff -a#久关闭swap分区sudo sed -i 's/.*swap.*/#&/' /etc/fstab
8.关闭selinux
#查看getenforcecat /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 # 安装 dockersudo yum install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin# 安装 containerdsudo yum install -y containerd
- 配置
# 停止 containerdsudo systemctl stop containerd.service # 生成并修改配置文件sudo cp /etc/containerd/config.toml /etc/containerd/config.toml.baksudo containerd config default > $HOME/config.tomlsudo 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 # 启动 dockersudo systemctl start docker.service# 将 docker 加入开机自启sudo systemctl enable docker.servicesudo systemctl enable docker.socketsudo systemctl list-unit-files | grep docker sudo systemctl daemon-reloadsudo systemctl restart dockersudo docker info sudo systemctl status docker.servicesudo systemctl status containerd.service
10.添加阿里云 k8s 镜像仓库
添加/etc/yum.repos.d/kubernetes.repo
文件;文件内容如下
[kubernetes]name=Kubernetesbaseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/# 是否开启本仓库enabled=1# 是否检查 gpg 签名文件gpgcheck=0# 是否检查 gpg 签名文件repo_gpgcheck=0gpgkey=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/dockervi /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 <<EOFoverlaybr_netfilterEOFmodprobe overlaymodprobe br_netfilter cat >/etc/sysctl.d/k8s.conf <<EOFnet.bridge.bridge-nf-call-iptables=1net.bridge.bridge-nf-call-ip6tables=1net.ipv4.ip_forward=1EOF sysctl --system # 通过运行以下指令确认br_netfilter和overlay模块被加载lsmod | egrep 'overlay|br_netfilter'# 通过运行以下指令确认net.bridge.bridge-nf-call-iptables、net.bridge.bridge-nf-call-ip6tables系统变量在你的sysctl配置中被设置为1sysctl 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-reloadsudo systemctl restart kubeletsudo 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/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo 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 VERSIONk8s-master NotReady control-plane 8m42s v1.27.1k8s-worker1 NotReady <none> 82s v1.27.1k8s-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-bfxtkkubectl logs -n kube-system coredns-7bdc4cb885-28jnf
新建/etc/crictl.yaml
文件,写入如下内容
runtime-endpoint: unix:///run/containerd/containerd.sockimage-endpoint: unix:///run/containerd/containerd.socktimeout: 10debug: 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# 获取podkubectl get pods --all-namespaces -o wide# 查看镜像列表kubeadm config images list# 节点加入集群kubeadm token create --print-join-command# 描述nodekubectl describe node k8s-master# 描述podkubectl 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) 这一栏会有