文章目录
-
- 1.机器规划
- [2.安装 Docker](#2.安装 Docker)
- 3.安装K8S
-
- 1.禁用swap
- 2.安装Kubernetes相关软件
- 3.master节点拉取k8s镜像
- [4.初始化Kubernetes Master节点](#4.初始化Kubernetes Master节点)
- 5.在集群中加入node节点(仅在node节点执行)
- 6.安装网络插件
- 7.单机版解除限制
- 4.部署nginx
-
- 1.创建命名空间
- 2.创建Deployment+Service
- [3.查看nginx pod service](#3.查看nginx pod service)
- 4.验证nginx
- 5.常用命令
- 问题
中文文档 : https://kubernetes.io/zh-cn/docs/home/
1.机器规划
IP | hostname | Role | 组件 |
---|---|---|---|
10.224.76.114 | k8s-master | Master | docker、cri-dockerd、kubelet、kubeadm 、 kubectl、Flannel、etcd等镜像 |
10.224.76.115 | k8s-node1 | Node | docker、cri-dockerd、kubelet、kubeadm 、 kubectl |
10.224.76.116 | k8s-node2 | Node | docker、cri-dockerd、kubelet、kubeadm 、 kubectl |
1.设置hostname
每台机器都执行,设置对应的hostname
sh
# 在相应的机器上执行
#master
hostnamectl set-hostname k8s-master
#node1
hostnamectl set-hostname k8s-node1
#node2
hostnamectl set-hostname k8s-node2
2.编辑/etc/hosts
每台机器都执行
shell
cat >> /etc/hosts << EOF
10.224.76.114 k8s-master
10.224.76.115 k8s-node1
10.224.76.116 k8s-node2
EOF
3.安装ntpdate并同步时间
shell
yum -y install ntpdate
ntpdate ntp1.aliyun.com
systemctl start ntpdate
sustemctl enable ntpdate
systemctl status ntpdate
4.关闭防火墙
shell
systemctl stop firewalld.service
systemctl disable firewalld.service
5.关闭selinux
shell
sed -i 's/enforcing/disabled/' /etc/selinux/config # 永久关闭
2.安装 Docker
1.安装Docker
换成国内docker仓库
shell
cat <<EOF > /etc/docker/daemon.json
{
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn" // 国内镜像
],
"insecure-registries": ["192.168.1.10:5000"], // 内部仓库
"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
# 重启docker
systemctl restart docker
# 查看docker信息
docker info
2.安装容器运行时cri-dockerd
参考: https://github.com/Mirantis/cri-dockerd 可以从release版本中直接下载rpm包安装比较简单
shell
# 下载
wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.1/cri-dockerd-0.3.1-3.el7.x86_64.rpm
# 安装
rpm -ivh cri-dockerd-0.3.1-3.el7.x86_64.rpm
配置cri-docker使用国内镜像
shell
vim /usr/lib/systemd/system/cri-docker.service
修改配置如下:
ini
ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd:// --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.9
启动服务
shell
systemctl daemon-reload && systemctl start cri-docker && systemctl enable cri-docker
查看服务状态
shell
systemctl status cri-docker
3.安装K8S
1.禁用swap
因为Kubernetes 不支持在节点上启用交换空间。
检查交换空间状态:
sh
# 查不到记录 就是没有开启
sudo swapon --show
禁用交换空间:
sh
sudo swapoff -a
永久禁用交换空间(可选):
sh
vim /etc/fstab
在文件中注释掉交换空间的相关行:
ini
# /swapfile none swap sw 0 0
2.安装Kubernetes相关软件
1.添加 Kubernetes 软件仓库,修改Kubernetes源
修改为阿里云源
shell
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=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
2.更新缓存
shell
yum clean all
yum -y makecache
# 查看可安装版本
yum list kubelet --showduplicates | sort -r
3.安装 kubelet、kubeadm 和 kubectl
这里安装的版本是1.26.6。
自 1.24 版起,Dockershim 已从 Kubernetes 项目中移除。即默认不支持docker了。
-
kubelet :是运行在每个 Kubernetes 节点上的代理程序,负责管理节点上的容器和 Pod。kubelet 接收来自 Master 节点的指令,根据这些指令来创建、启动、停止、监控 Pod,并与容器运行时(如 Docker)进行交互,确保 Pod 在节点上按预期运行。
-
kubeadm :用于在 Kubernetes 环境中启动和管理集群的工具。它能够帮助你进行集群的初始化、添加新节点、重置集群状态等操作,简化了集群的部署和管理过程。kubeadm 通常用于搭建 Kubernetes 集群的第一步,它可以配置集群的网络、安装核心组件等。
-
kubectl :是 Kubernetes 的命令行工具,用于与 Kubernetes 集群进行交互。通过 kubectl,你可以管理集群中的各种资源,如 Pod、Service、Deployment 等。它支持对集群进行部署、扩容、升级、维护等操作,是 Kubernetes 集群管理的主要工具之一。
shell
# 没安装过的直接跳过卸载步骤
kubeadm reset
# 卸载老版本
sudo systemctl stop kubelet
sudo yum remove kubelet kubeadm kubectl
# 清理相关文件和目录(可选)
sudo rm -rf /etc/kubernetes /var/lib/kubelet /var/lib/kube-proxy /var/lib/kubernetes /var/run/kubernetes /etc/systemd/system/kubelet.service.d
# 清理 Docker 中的容器和镜像(可选)
sudo docker rm -f $(sudo docker ps -aq)
sudo docker rmi -f $(sudo docker images -aq)
# 安装指定版本
yum install -y kubelet-1.26.6-0 kubeadm-1.26.6-0 kubectl-1.26.6-0
# 检查版本信息
kubelet --version
kubectl version --output=json
kubeadm version
# 启动
sudo systemctl start kubelet
# 开机自启
systemctl enable kubelet
systemctl status kubelet
# 如果kubelet 异常 执行下列命令查看日志 我经常碰到异常,但是过一会儿自己好了。。。
journalctl -xeu kubelet
3.master节点拉取k8s镜像
仅在master节点执行
shell
kubeadm config images pull --kubernetes-version=v1.26.6 --image-repository registry.aliyuncs.com/google_containers --cri-socket=unix:///var/run/cri-dockerd.sock
shell
#查看镜像
docker images
registry.aliyuncs.com/google_containers/kube-apiserver v1.26.6
registry.aliyuncs.com/google_containers/kube-proxy v1.26.6
registry.aliyuncs.com/google_containers/kube-scheduler v1.26.6
registry.aliyuncs.com/google_containers/kube-controller-manager v1.26.6
registry.aliyuncs.com/google_containers/kube-proxy v1.26.4
registry.aliyuncs.com/google_containers/etcd 3.5.6-0
registry.aliyuncs.com/google_containers/pause 3.9
registry.aliyuncs.com/google_containers/coredns v1.9.3
4.初始化Kubernetes Master节点
仅在master节点执行
shell
#注:10.224.76.114是本机IP地址
kubeadm init --kubernetes-version=1.26.6 --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=10.224.76.114 --ignore-preflight-errors=all --image-repository=registry.aliyuncs.com/google_containers --cri-socket=unix:///var/run/cri-dockerd.sock
- --kubernetes-version:指定Kubernetes的版本。
- --pod-network-cidr: 指定pod网络的IP地址,它的值取决于你选择哪个网络,比如Flannel网络,因此值需要指定为10.244.0.0/16,因为Flannel网络相对于其他网络要简单一些,对于刚开始搭建Kubernetes集群比较友好,需要的配置较少,功能也较为完善。
- --apiserver-advertise-address: 指定master节点发布的IP地址,如果不指定,则会自动检测网络接口,通常是内网IP。
- --ignore-preflight-errors:检查错误将显示为检查的警告列表。值为all会忽略所有检查中的错误。
- --image-repository:选择一个Container Registry从中拉取控制平面镜像(默认为k8s.gcr.io,这个Container Registry拉取镜像特别慢,会导致超时,换成阿里云的Container Registry)。
- ---cri-socket:指定cri-dockerd接口,如果是containerd则使用unix:///run/containerd/containerd.sock
初始化成功日志如下:
ini
Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Alternatively, if you are the root user, you can run:
export KUBECONFIG=/etc/kubernetes/admin.conf
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 10.224.76.114:6443 --token bca3ta.ivxr8huu3f560645 \
--discovery-token-ca-cert-hash sha256:dc07fce82b93428828b7b70e5f6c024ef64c43fc4d0c50b84b95d1e5deeb16b3
配置
sh
# 要使非 root 用户可以运行 kubectl,请运行以下命令
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 如果你是root 用户,则可以运行:
export KUBECONFIG=/etc/kubernetes/admin.conf
# 如果想重新初始化,可执行kubeadm reset
# 直接给它放到环境变量中,以免关闭服务器后重新启动
vim /etc/profile
#放到最后面
export KUBECONFIG=/etc/kubernetes/admin.conf
# 保存并关闭文件,然后重新加载 /etc/profile 文件以使更改生效:
source /etc/profile
# 一条命令搞定
echo 'export KUBECONFIG=/etc/kubernetes/admin.conf' | sudo tee -a /etc/profile && source /etc/profile
5.在集群中加入node节点(仅在node节点执行)
如果是单节点版本就跳过这个步骤。
复制上面的join token
shell
kubeadm join 10.224.76.114:6443 --token bca3ta.ivxr8huu3f560645 \
--discovery-token-ca-cert-hash sha256:dc07fce82b93428828b7b70e5f6c024ef64c43fc4d0c50b84b95d1e5deeb16b3 --cri-socket=unix:///var/run/cri-dockerd.sock
如果找不到加入的token,则在master节点生成节点加入的token
sh
kubeadm token create --print-join-command
6.安装网络插件
通常使用 Calico 或 Flannel 作为网络插件。这里以 Flannel 为例,可以通过以下命令安装 Flannel 网络插件:
shell
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
获取flannel pod状态:
bash
kubectl get pod -n kube-system
最后,我们看下node的状态:显示为Ready就表示已经OK啦
bash
kubectl get node
kubectl get node -o wide
kubectl cluster-info
kubectl get pod --all-namespaces
# 用 kubectl describe 来查看这个节点(Node)对象的详细信息、状态和事件(Event)
kubectl describe node master
# 通过 kubectl get 重新检查 Pod 的状态:
kubectl get pods -n kube-system
# 部署过程中任何环节有问题都可以查看日志
journalctl -l -u kubelet
7.单机版解除限制
默认k8s的master节点是不能跑pod的业务,需要执行以下命令解除限制。
单机版才需要搞这个。
shell
kubectl get nodes
#查看污点
kubectl describe node k8s-master|grep -i taints
#去除污点
kubectl taint node k8s-master1 node-role.kubernetes.io/control-plane:NoSchedule-
#再次查看污点
kubectl describe node k8s-master|grep -i taints
4.部署nginx
1.创建命名空间
shell
# 创建命名空间
kubectl create namespace laker
2.创建Deployment+Service
shell
kubectl apply -f nginx-k8s.yaml
nginx-k8s.yaml
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
namespace: laker
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.23.2
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx-service
namespace: laker
spec:
ports:
- nodePort: 30080
port: 80
protocol: TCP
targetPort: 80
selector:
app: nginx
type: NodePort
3.查看nginx pod service
shell
kubectl -n laker get pod,svc -o wide
4.验证nginx
浏览器访问:http://10.224.76.114:30080
5.常用命令
shell
# 查看 pod
kubectl -n laker get pod -o wide
# 进入 pod
kubectl -n laker exec -it pod名称 bash
# 编辑 pod
kubectl -n laker edit deployment nginx-deployment
# 删除 pod
kubectl -n laker delete deployment nginx-deployment
# 编辑 Service
kubectl -n laker edit service nginx-service
# 删除 Service
kubectl -n laker delete service nginx-service
# 查看 pod、Service
kubectl -n 命名空间 get pod,svc -o wide
问题
问题1.工作节点name显示localhost,ROLES显示为none
忘记设置机器的hostname了
ini
[root@k8s-master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master1 Ready control-plane 5d23h v1.26.6
localhost Ready <none> 10m v1.26.6
解决
shell
# master上 删除节点
kubectl delete node localhost
# master上 查看是否删除完毕
kubectl get nodes
# node上
kubeadm reset --cri-socket=unix:///var/run/cri-dockerd.sock
# master上
kubeadm token create --print-join-command
# node上
kubeadm join 10.224.76.114:6443 --token npopgd.ydlfidy8kt9n2p3d --discovery-token-ca-cert-hash sha256:dc07fce82b93428828b7b70e5f6c024ef64c43fc4d0c50b84b95d1e5deeb16b3 --cri-socket=unix:///var/run/cri-dockerd.sock
# master上 验证
kubectl get nodes
# 为节点分配角色标签,你可以使用以下命令
kubectl label node k8s-node2 node-role.kubernetes.io/worker=
问题2. pod、service间如何访问
解决
通过 DNS:Service 会自动分配一个 DNS 名称,格式为 <service-name>.<namespace>.svc.cluster.local
。Pod 可以通过 Service 的 DNS 名称来访问 Service。
shell
curl http://nginx-service.laker.svc.cluster.local:80