两种部署方式:
- kubeadm工具部署。Kubeadm 是一个K8s 部署工具,提供 kubeadm init 和kubeadm join,用于快速部署 Kubernetes集群。
- kubeadm 工具功能:
- kubeadm init:初始化一个 Master 节点。
- kubeadm join:将工作节点加入集群。
- kubeadm upgrade:升级 K8s 版本。
- kubeadm token:管理 kubeadm join 使用的令牌。
- kubeadm reset:清空 kubeadm init 或者 kubeadm join 对主机所做的任何更改。
- kubeadm version:打印 kubeadm 版本。
- kubeadm alpha:预览可用的新功能。
- 二进制包部署。从 github获取发行版的二进制包,手动依次部署每个组件组成Kubernetes 集群。可以先使用kubeadm工具部署,熟悉之后再进行二进制部署加深理解。
注意事项:
- 服务器最好可以访问外网,会有从网上拉取镜像需求。若服务器不能上网,需提前下载对应镜像并导入节点。
节点 | 实验环境配置 | 测试环境配置 | 生产环境配置 |
---|---|---|---|
master | 2核CPU、2G内存、50G硬盘 | 2核CPU、4G内存、20G硬盘 | 8核CPU、16G内存、100G硬盘 |
node | 2核CPU、2G内存、50G硬盘 | 4核CPU、8G内存、20G硬盘 | 16核CPU、64G内存、500G硬盘 |
软件环境 | 版本 | 备注 |
---|---|---|
操作系统 | CentOS Linux release 7.5.1804 (Core) | CentOS 7.X系列版本都可,最好是最小化安装。 |
Docker | 19-ce | \ |
Kubernetes | 1.25 | \ |
IP | 角色 |
---|---|
192.168.130.145 | K8S-master |
192.168.130.146 | K8s-node1 |
192.168.130.147 | K8s-node2 |
- 以下操作,所有服务器执行。
1.关闭所有服务器防火墙。
systemctl stop firewalld
systemctl disable firewalld
2.关闭所有服务器selinux。
#永久关闭,需重启服务器才能生效。
sed -i 's/enforcing/disabled/g' /etc/selinux/config
#临时关闭,立即生效,重启服务器后还原配置。
setenforce 0
3.关闭所有服务器swap分区。
#永久关闭。
sed -ri 's/.*swap.*/#&/g' /etc/fstab
#临时关闭。
swapoff -a
4.根据规划设置主机名称。
hostnamectl set-hostname K8s-master
hostnamectl set-hostname K8s-node1
hostnamectl set-hostname K8s-node2
cat >> /etc/hosts << EOF
192.168.130.145 k8s-master
192.168.130.146 k8s-node1
192.168.130.147 k8s-node2
EOF
6.将桥接的IPv4流量传递到iptables的链。
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
#重启生效。
sysctl --system
7.时间同步。
yum install ntpdate -y
ntpdate time.windows.com
- K8s集群需要安装容器运行时,我这里使用的是docker作为容器引擎。
- 其他主流容器引擎:
- containerd:containerd最开始是在docker里面的,后面将docker进行解耦把containerd单独做成一个标准的CRI运行时,再往后就捐赠给了CNCF基金会交其维护,但docker一致是与containerd相兼容的。
- cri-o、podman:都属于红帽(RedHat)项目,目前红帽主推podman。
- 以下操作步骤,所有服务器执行。
1.安装docker环境。
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
yum -y install docker-ce
systemctl enable docker && systemctl start docker
2.配置加速器。
cat > /etc/docker/daemon.json << EOF
{
"registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"]
}
EOF
3.重启查看。
systemctl restart docker
docker info
4.添加阿里的镜像源。
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
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
为什么要安装cri-dockerd插件?
- K8s在刚开源时没有自己的容器引擎,而当时docker非常火爆是容器的代表,所以就在kubelet的代码里集成了对接docker的代码——docker shim,所以1.24版本之前是默认使用docker,不需要安装cri-dockerd。
- K8s 1.24版本移除 docker-shim的代码,而 Docker Engine 默认又不支持CRI标准,因此二者默认无法再直接集成。为此,Mirantis 和 Docker 为了Docker Engine 提供一个能够支持到CRI规范的桥梁,就联合创建了cri-dockerd,从而能够让 Docker 作为K8s 容器引擎。
为什么要移除docker shim?
- K8s核心代码优化。
- Docker内部调用链比较复杂,多层封装和调用,导致性能降低、提升故障率、不易排查。
- Docker还会在宿主机创建网络规则、存储卷,也带来了安全隐患
注意事项:
- 以下操作步骤,所有服务器执行。
1.下载安装。
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
2.修改配置文件,重新读取。
vim /usr/lib/systemd/system/cri-docker.service
#找到这行,添加路径。
ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd:// --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.7
systemctl daemon-reload
3.启动,并设置开机自启。
systemctl enable cri-docker && systemctl start cri-docker
- 以下操作步骤,所有服务器执行。
1.安装三个工具,版本需要统一。
yum install -y kubelet-1.25.0 kubeadm-1.25.0 kubectl-1.25.0
2.设置开机自启,暂时不要启动。
systemctl enable kubelet
1.master节点初始化。
参数释义:
- –apiserver-advertise-address 集群通告地址
- –image-repository 由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址
- –kubernetes-version K8s版本,与上面安装的一致
- –service-cidr 集群内部虚拟网络,Pod统一访问入口
- –pod-network-cidr Pod网络,,与下面部署的CNI网络组件yaml中保持一致。
- –cri-socket 指定 cri-dockerd 接口,如果是 containerd 则使用–cri-socketunix:///run/containerd/containerd.sock
注意事项:
- 初始化完成后,最后会输出一个 join 命令,复制下来,下面用。
kubeadm init \
--apiserver-advertise-address=192.168.130.145 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.25.0 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16 \
--cri-socket=unix:///var/run/cri-dockerd.sock \
--ignore-preflight-errors=all
2.修改kubectl使用的连接k8s认证文件到默认路径,不然会报错。
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
3.查看工作节点,此时就可以使用kubectl命令了。
[root@k8s-master yum.repos.d]# kubectl get nodes
注意事项:
- 向集群添加新节点,将前面执行kubeadm init 命令时最后输出的kubeadm join 命令复制过来,并手动加上参数–cri-socket=unix:///var/run/cri-dockerd.sock,再在命令行执行。
- 默认token有效期为24小时,过期后,此token就不可用。这时就需要重新创建token,可以直接使用命令快捷生成:kubeadm token create --print-join-command
1.依次在所有node节点上执行加入集群命令。
[root@k8s-node1 yum.repos.d]# kubeadm join 192.168.130.145:6443 --token dxc3x4.ggvxomofqelw1g0l --discovery-token-ca-cert-hash sha256:e5b0a56b7c5108800a15b94bbdbde8ea47dc4c2e7c04973d34bf2280d65e80f1 --cri-socket=unix:///var/run/cri-dockerd.sock
[root@k8s-node2 yum.repos.d]# kubeadm join 192.168.130.145:6443 --token dxc3x4.ggvxomofqelw1g0l --discovery-token-ca-cert-hash sha256:e5b0a56b7c5108800a15b94bbdbde8ea47dc4c2e7c04973d34bf2280d65e80f1 --cri-socket=unix:///var/run/cri-dockerd.sock
不同docker主机容器访问存在的问题 :
- 存在两容器分配的ip相同问题,因为docker主机有各自对立的网络管理机制。
- 存在容器发送的数据包不知道要发送到那个节点问题。即使两个容器ip手动设置成不同,那容器1和容器2的网络也是不通的,是因为容器1发送的数据包不知道要送往哪个节点。
- 存在docker主机之间的通信问题。即使容器1知道要送往哪个节点,也只能通过手动方式去实现,比如路由表、iptables转发等等。
- 以上三个问题都是很耗时耗力的,所以需要引入网络组件来解决这些问题。
部署网络组件的原因?
- 为打通Pod到Pod之间网络、Node与Pod之间网络,从而集群中数据包可以任意传输,形成了一个扁平化网络。
主流网络组件:
- Flannel
- Calico
注意事项:
- 若导入yaml文件后一直处于pending状态,大概率是网络较差,可以手动下载镜像,再apply -f。
- 以下操作在master节点执行。
1.下载文件到本地,文件下载地址。
[root@k8s-master ~]# curl https://raw.githubusercontent.com/projectcalico/calico/v3.25.1/manifests/calico.yaml -O
2.修改Calico配置文件里的定义Pod网络(CALICO_IPV4POOL_CIDR),与前面kubeadm init的 --pod-network-cidr指定一致。
[root@k8s-master ~]# vim calico.yaml
......
- name: CALICO_IPV4POOL_CIDR
value: "10.244.0.0/16"
[root@k8s-master ~]# kubectl apply -f calico.yaml
4.查看Calico容器网络状态,拉取镜像需要等两分钟,有点慢。
[root@k8s-master ~]# kubectl get pods -n kube-system
- Dashboard是官方提供的一个UI,可用于基本管理K8s资源。
- 以下操作在master节点执行。
1.下载yaml文件。
[root@k8s-master ~]# wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.4.0/aio/deploy/recommended.yaml
2.修改yaml文件内容。默认Dashboard只能集群内部访问,修改Service为NodePort类型,暴露到外部。
......
kind: Service
apiVersion: v1
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kubernetes-dashboard
spec:
ports:
- port: 443
targetPort: 8443
nodePort: 30001 ##添加此行。
selector:
k8s-app: kubernetes-dashboard
type: NodePort ##添加此行。
......
[root@k8s-master ~]# kubectl apply -f recommended.yaml
[root@k8s-master ~]# kubectl get pods -n kubernetes-dashboard
1.访问k8s任意节点IP:30001,会发现被拦截了,这是因为chrome认为该网站不安全,不让访问,我们在当前页面随意处输入“thisisunsafe”回车即可解决,相当于了解了风险依然访问,之后就可以访问网页,但那之后再出问题也就没有责任了。
2.此时需要我们输入Token登录。
3.获取Token。创建service account并绑定默认cluster-admin管理员集群角色。
[root@k8s-master ~]# kubectl create serviceaccount dashboard-admin -n kubernetes-dashboard
[root@k8s-master ~]# kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kubernetes-dashboard:dashboard-admin
[root@k8s-master ~]# kubectl create token dashboard-admin -n kubernetes-dashboard
1.创建一个pods。
2.查看Pods。
3.也可以在终端上查看pods运行状态。
注意事项:
- containerd是一个主流的容器引擎,与Docker相兼容,相比Docker轻量很多,目前较为成熟。
- containerd是独立的运行时,一个集群可以有多个运行时,比如docker和containerd可以同时存在,但一般就是用一个,不建立交叉使用。
- 若是docker切换成containerd,则需要给一个集群所有节点都切换,以下操作只切换了master节点,只做示范。
- 不同运行时的镜像是通用的。
1.启用两个内核模块。操作系统默认是有的,若没有,则执行代码框的内容进行添加启用。
cat <
2.设置sysctl 参数。若是第一次直接使用containerd,则需要把下面几个参数都要添加进去;若是docker切换成containerd,按照前文的操作,前两个参数已经添加,只需要确定添加最后一个参数。
cat <
1.安装。若是直接使用containerd,需要执行此步骤进行安装;若是由docker更换成containerd,则直接进行第二步,因为在前文安装docker时,已经把contained安装了。
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
yum install -y containerd.io
2.创建配置文件目录。
#若是按照前文操作来的,已经生成该目录,且存在配置文件,不需在创建,只用执行第二个命令;若不是按照前文来操作的,需创建。
mkdir -p /etc/containerd
1.修改containerd运行模式,以独立模式运行,也就是不需要安装docker就可以运行。
containerd config default > /etc/containerd/config.toml
修改containerd运行参数:
- pause镜像设置过阿里云镜像仓库地址。
- 拉取Docker Hub镜像配置加速地址设置为阿里云镜像仓库地址。
1.修改一
vi /etc/containerd/config.toml
......
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.2"
2.修改二
vi /etc/containerd/config.toml
......
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
#添加这两行。
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
endpoint = ["https://b9pmyelo.mirror.aliyuncs.com"]
systemctl restart containerd
[root@k8s-master containerd]# vim /var/lib/kubelet/kubeadm-flags.env
[root@k8s-master containerd]# systemctl restart kubelet
1.此时查看master节点已经采用containerd容器引擎。
[root@k8s-master containerd]# kubectl get node -o wide
2.此时关闭cri-docker和docker不影响containerd的运行使用。
- containerd提供了ctr命令行工具管理容器,但功能比较简单,所以一般会用crictl工具检查和调试容器。
- 项目地址:https://github.com/kubernetes-sigs/cri-tools/
1.不设置会报错。
2.指定使用containerd容器运行时的API接口。
[root@k8s-master containerd]# vim /etc/crictl.yaml
runtime-endpoint: unix:///run/containerd/containerd.sock ##指定容器运行时的文件接口。
image-endpoint: unix:///run/containerd/containerd.sock ##指定容器运行时管理镜像的接口。
timeout: 10 ##指定容器运行时的连接超时时间。
debug: false ##是否输出debug信息。
镜像相关功能 | docker | containerd(crictl) |
---|---|---|
显示本地镜像列表 | docker images | crictl images |
下载镜像 | docker pull | crictl pull |
上传镜像 | docker push | 无,例如buildk |
删除本地镜像 | docker rmi | crictl rmi |
查看镜像详情 | docker inspect IMAGE-ID | crictl inspecti IMAGE-ID |
容器相关功能 | Docker | containerd(crictl) |
---|---|---|
显示容器列表 | docker ps | crictl ps |
创建容器 | docker create | crictl create |
启动容器 | docker start | crictl start |
停止容器 | docker stop | crictl stop |
删除容器 | docker rm | crictl rm |
查看容器详情 | docker inspect | crictl inspect |
附加容器 | docker attach | crictl attach |
执行命令 | docker exec | crictl exec |
查看日志 | docker logs | crictl logs |
查看容器资源 | docker stats | crictl stats |
POD 相关功能 | Docker | containerd(crictl) |
---|---|---|
显示 POD 列表 | 无 | crictl pods |
查看 POD 详情 | 无 | crictl inspectp |
运行 POD | 无 | crictl runp |
停止 POD | 无 | crictl stopp |
命令 | 释义 |
---|---|
create | 通过文件名或标准输入创建资源 |
expose | 为Deployment,Pod创建Service |
run | 在集群中运行一个特定的镜像 |
set | 在对象上设置特定的功能 |
explain | 文档参考资料 |
get | 显示一个或多个资源 |
edit | 使用系统编辑器编辑一个资源。 |
delete | 通过文件名、标准输入、资源名称或标签选择器来删除资源。 |
命令 | 释义 |
---|---|
rollout | 管理Deployment,Daemonset资源的发布(例如状态、发布记录、回滚等) |
scale | 对Deployment、ReplicaSet、RC或Job资源扩容或缩容Pod数量 |
autoscale | 为Deploy, RS, RC配置自动伸缩规则(依赖metrics-server和hpa) |
命令 | 释义 |
---|---|
certificate | 修改证书资源 |
cluster-info | 显示集群信息 |
top | 查看资源利用率(依赖metrics-server) |
cordon | 标记节点不可调度 |
uncordon | 标记节点可调度 |
drain | 驱逐节点上的应用,准备下线维护 |
taint | 修改节点taint标记 |
命令 | 释义 |
---|---|
describe | 显示资源详细信息 |
logs | 查看Pod内容器日志,如果Pod有多个容器,-c参数指定容器名称 |
attach | 附加到Pod内的一个容器 |
exec | 在容器内执行命令 |
port-forward | 为Pod创建本地端口映射 |
proxy | 为Kubernetes API server创建代理 |
cp | 拷贝文件或目录到容器中,或者从容器内向外拷贝 |
auth | 检查授权 |
debug | 创建调试会话,用于排查工作负载和工作节点故障 |
命令 | 释义 |
---|---|
diff | 将在线配置与指定的文件对比 |
apply | 从文件名或标准输入对资源创建/更新 |
patch | 使用补丁方式修改、更新资源的某些字段 |
replace | 从文件名或标准输入替换一个资源 |
kustomize | 从目录或者URL构建kustomization目标 |
命令 | 释义 |
---|---|
label | 给资源设置、更新标签 |
annotate | 给资源设置、更新注解 |
completion kubectl | 自动补全 1、安装依赖包bash-completion。 2、设置在bash中自动补全:source <(kubectl completion bash) |
命令 | 释义 |
---|---|
api-resources | 查看所有资源 |
api-versions | 打印受支持的API版本 |
config | 修改kubeconfig文件(用于访问API,比如配置认证信息) |
version | 查看kubectl和k8s版本 |
- 问题:其他工作节点无法使用kubectl命令。
1.现在node节点上的/root目录下创建.kube目录。
[root@k8s-node1 ~]# mkdir .kube
[root@k8s-node2 ~]# mkdir .kube
2.把master节点上的.kube/config文件复制到其他工作节点同目录下。
[root@k8s-master ~]# scp .kube/config [email protected]:/root/.kube/
[root@k8s-master ~]# scp .kube/config [email protected]:/root/.kube/
- kubectl命令默认不支持补全功能,我们可以把补全相关的内容写入到bash中,这里就需要linux中的bash补全包,其他工具的补全命令都需要这个命令。
1.安装依赖包,linux的mini版本是没有装的。
[root@k8s-master ~]# yum install -y bash-completion
[root@k8s-master ~]# bash
2.在 bash 中设置当前 shell 的自动补全,随后命令就可以补全,但重启机器就会失效。
[root@k8s-master ~]# source <(kubectl completion bash)
3.开机自启,永久生效。
[root@k8s-master ~]# echo "source <(kubectl completion bash)" >> ~/.bashrc
[root@k8s-master ~]# source .bashrc