文章目录
1、搭建K8S环境平台规划
2、服务器硬件配置要求
3、搭建k8s集群部署方式
4、kubeadm方式部署——系统初始化操作
5、kubeadm方式部署——部署master节点
1️⃣所有节点安装Docker
2️⃣所有节点配置阿里云Docker、kubernetes镜像
3️⃣所有节点安装kubelet kubeadm kubectl
4️⃣部署Kubernetes Master节点
6、kubeadm方式部署——部署node节点
5️⃣将 Node节点 加入到Kubernetes Master节点
6️⃣部署CNI网络插件
7️⃣测试kubernetes集群
7. kubeadm常用的命令
1、搭建K8S环境平台规划
2、服务器硬件配置要求
测试环境配置要求
节点 CPU内核数 内存大小 硬盘大小
master 2核及以上 4G及以上 20GB及以上
node 4核及以上 8G及以上 40GB及以上
生产环境配置要求
配置要求更高。
3、搭建k8s集群部署方式
(1)kubeadm
是一个K8S部署工具,提供kubeadm init 和 kubeadm join,用于快速部署K8S集群。
参考链接:使用 kubeadm 引导集群 | Kubernetes
(2)二进制包
4、kubeadm方式部署——系统初始化操作
kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具,这个工具能通过两条指令完成一个kubernetes集群的部署:
第一、创建一个 Master 节点 kubeadm init
第二、将 Node 节点加入到当前集群中 kubeadm join <Master节点的IP和端口>
环境要求
工作节点 主机名 IP地址 系统版本 内存 CPU 磁盘
master k8s-master 192.168.200.31 CentOS 7.9 2GB 2核 30GB
node1 k8s-node1 192.168.200.32 CentOS 7.9 8GB 2核 30GB
node2 k8s-node2 192.168.200.33 CentOS 7.9 8GB 2核 30GB
准备CentOS 7.9镜像安装三台虚拟机
硬件配置要求如上
三台虚拟机能够相互访问
虚拟机可以访问外网,拉去镜像
禁止swap分区
安装前准备工作
1、修改主机名
hostnamectl set-hostname k8s-master
2、添加主机名
cat >> /etc/hosts << EOF
192.168.200.31 k8s-master
192.168.200.32 k8s-node1
192.168.200.33 k8s-node2
EOF
3、关闭防火墙
systemctl stop firewalld && systemctl disable firewalld
systemctl status firewalld
4、关闭selinux
# 临时允许
setenforce 0
getenforce
# 永久允许
sed -i "s/SELINUX=enforcing/SELINUX=permissive/g" /etc/selinux/config
cat /etc/selinux/config
5、关闭swap分区
# 参考链接:https://www.cnblogs.com/architectforest/p/12982886.html
# 查看swapoff的版本
swapoff --version
# 临时关闭❎
swapoff -a
# 永久关闭❎
sed -ri 's/.*swap.*/#&/' /etc/fstab # 重启生效
# 使用swapon检查
swapon -v #输出为空,表示swap已关闭
# 使用free命令检查
free -m
# 重新启动swap分区
swapon -a
6、配置网卡联网
cat /etc/sysconfig/network-scripts/ifcfg-ens32
7、配置阿里云镜像
cd /etc/yum.repos.d/ && mkdir bak && mv CentOS-* bak/
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo
8、生成本地缓存
yum makecache fast
9、更新YUM源软件包
yum update -y
10、将桥接的 IPv4 流量传递到 iptables 的链
cat >> /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
# cat /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
[root@k8s-master ~]#
11、设置主机之间时间同步
yum install -y ntpdate
ntpdate time.windows.com
5、kubeadm方式部署——部署master节点
1️⃣所有节点安装Docker
#yum安装gcc相关环境(需要确保虚拟机可以上外网。)
yum install -y gcc && yum install -y gcc-c++
1、卸载旧版本docker
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
2、安装需要的依赖包
yum install -y yum-utils
3、设置阿里云docker镜像
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo # 默认镜像源是国外的,不推荐使用
yum-config-manager \
--add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # 推荐使用国内镜像
4、安装docker docker-ce ee企业版
yum install -y docker-ce docker-ce-cli containerd.io
5、启动Docker
systemctl start docker && systemctl enable docker && systemctl status docker
6、查看docker版本信息
docker version
2️⃣所有节点配置阿里云Docker、kubernetes镜像
7、配置阿里云docker镜像加速
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://w2kavmmf.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload && systemctl restart docker
8、配置阿里云Kubernetes 镜像
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=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
8、配置阿里云Kubernetes 镜像
3️⃣所有节点安装kubelet kubeadm kubectl
# 指定K8S版本安装,不指定版本默认安装最新版。
yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0
systemctl enable kubelet
4️⃣部署Kubernetes Master节点
这里指定阿里云镜像仓库地址,默认的镜像地址无法加载访问。
kubeadm init \
--apiserver-advertise-address=192.168.200.31 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.18.0 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16
要开始使用集群,需要以普通用户的身份运行以下命令:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
[root@k8s-master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master NotReady master 6m8s v1.18.0
[root@k8s-master ~]#
6、kubeadm方式部署——部署node节点
5️⃣将 Node节点 加入到Kubernetes Master节点
在Node端执行操作。
加入任何数量的工作节点,通过运行以下每一个根节点:
kubeadm join 192.168.200.31:6443 --token 3myqeb.35plbttpfc0tjlvz \
--discovery-token-ca-cert-hash sha256:b8378ad91dc3c88577869edd53937f0be1851ae972035b8449e4eae875ef2542
# 集群状态为NotReady,需要添加CNI网络插件
[root@k8s-master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master NotReady master 12m v1.18.0
k8s-node01 NotReady <none> 116s v1.18.0
k8s-node02 NotReady <none> 5s v1.18.0
# 查看kubernetes版本
[root@k8s-master ~]# kubectl version
Client Version: version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.0", GitCommit:"9e991415386e4cf155a24b1da15becaa390438d8", GitTreeState:"clean", BuildDate:"2020-03-25T14:58:59Z", GoVersion:"go1.13.8", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.0", GitCommit:"9e991415386e4cf155a24b1da15becaa390438d8", GitTreeState:"clean", BuildDate:"2020-03-25T14:50:46Z", GoVersion:"go1.13.8", Compiler:"gc", Platform:"linux/amd64"}
默认token有效期为24小时,过期后,该token不能使用,需要重新创建token,命令如下:
kubeadm token create --print-join-command
6️⃣部署CNI网络插件
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
[root@k8s-master ~]# kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-7ff77c879f-9wt65 1/1 Running 0 26m
coredns-7ff77c879f-vf892 1/1 Running 0 26m
etcd-k8s-master 1/1 Running 0 26m
kube-apiserver-k8s-master 1/1 Running 0 26m
kube-controller-manager-k8s-master 1/1 Running 0 26m
kube-flannel-ds-65b8n 1/1 Running 0 4m22s
kube-flannel-ds-nx6gj 1/1 Running 0 4m22s
kube-flannel-ds-r6f25 1/1 Running 0 4m22s
kube-proxy-9mvdl 1/1 Running 0 26m
kube-proxy-pwd2b 1/1 Running 0 14m
kube-proxy-zslgz 1/1 Running 0 16m
kube-scheduler-k8s-master 1/1 Running 0 26m
查看集群节点状态是Ready
[root@k8s-master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master Ready master 28m v1.18.0
k8s-node01 Ready <none> 18m v1.18.0
k8s-node02 Ready <none> 16m v1.18.0
7️⃣测试kubernetes集群
在Kubernetes集群中创建一个pod,验证是否正常运行:
# 拉取nginx镜像
kubectl create deployment nginx --image=nginx
# nginx启动完成
# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-f89759699-r6j49 1/1 Running 0 88s
# 暴露nginx端口80
kubectl expose deployment nginx --port=80 --type=NodePort
# 查看暴露端口信息
# kubectl get pod,svc
NAME READY STATUS RESTARTS AGE
pod/nginx-f89759699-r6j49 1/1 Running 0 3m6s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 37m
service/nginx NodePort 10.101.19.205 <none> 80:31814/TCP 26s
访问地址:http://NodeIP:Port
kubectl create
kubectl create 命令用于在 Kubernetes 中创建资源。它可用于创建各种资源,包括 Pod、服务、部署等
例如,若要创建新部署,可以:
kubectl create deployment my-deployment --image=my-image
kubectl create deployment <deployment-name> --image=<image-name>
创建一个 Deployment 对象,指定容器镜像名称和部署名称。
kubectl create service <service-name> --tcp=<port>:<target-port>
创建一个 Service 对象,将容器的端口暴露到集群内部,并将其映射到指定的端口。
kubectl create configmap <configmap-name> --from-file=<path-to-file>
创建一个 ConfigMap 对象,用于存储应用程序的配置信息。
kubectl create secret generic <secret-name> --from-literal=<key>=<value>
创建一个 Secret 对象,用于存储敏感信息,如密码等。
kubectl create namespace <namespace-name>
创建一个 Namespace 对象,用于隔离和管理 Kubernetes 资源。
kubectl create job <job-name> --image=<image-name>
创建一个 Job 对象,用于在 Kubernetes 集群中运行一个或多个任务。
kubectl create cronjob <cronjob-name> --image=<image-name> --schedule=<cron-expression>
创建一个 CronJob 对象,用于定期运行一个或多个任务。
kubectl get
用于检索有关 Kubernetes 资源的信息。它可用于检索有关各种资源(包括 Pod、服务、部署等)的信息
例如,要检索有关 Kubernetes 集群中所有 Pod 的信息
kubectl get pods/deployments/svc/configmaps/secrets
kubectl describe
用于检索有关特定 Kubernetes 资源的详细信息。它可用于检索有关各种资源(包括 Pod、服务、部署等)的信息。
要检索有关特定容器的详细信息
kubectl describe pod <pod-name>
kubectl delete
用于删除 Kubernetes 资源。它可用于删除各种资源,包括 Pod、服务、部署
例如,要删除特定 Pod
kubectl delete pod my-pod
kubectl exec
kubectl exec 命令用于在正在运行的容器中执行命令。它可用于在各种容器中执行命令,包括 Pod、服务、部署等。
例如,要在正在运行的 Pod 中执行命令
kubectl exec my-pod -- ls
kubectl exec -it <pod-name> /bin/bash/
kubectl logs
kubectl logs 命令用于从容器中检索日志。它可用于从各种容器(包括 Pod、服务、部署等)中检索日志
kubectl logs my-pod
kubectl port-forward
用于转发来自各种 Pod 的端口,包括 Pod、服务、部署等
例如,要将本地计算机上的端口 8080 转发到 Pod 上的端口 80
kubectl port-forward my-pod 8080:80
kubectl scale
用于扩展或缩减 Kubernetes 资源。它可用于缩放各种资源,包括部署、副本集
用于扩展或缩减 Kubernetes 资源。它可用于缩放各种资源,包括部署、副本集
kubectl scale deployment my-deployment --replicas=5
kubectl rollout
用于管理 Kubernetes 资源的推出。它可用于管理各种资源的推出,包括部署、副本集
kubectl rollout status deployment/my-deployment
kubectl expose
用于将 Kubernetes 资源公开为服务。它可用于公开各种资源,包括 Pod、部署
例如,若要将部署公开为服务
kubectl expose deployment my-deployment --port=80 --target-port=8080
kubectl run
用于创建新的 Kubernetes 资源。它可用于创建各种资源,包括 Pod、deployment
kubectl run my-pod --image=my-image
kubectl config
用于管理 Kubernetes 配置。它可用于管理各种配置,包括上下文、群集
例如,要查看当前上下文配置
kubectl config current-context
kubectl cluster-info
kubectl cluster-info
命令用于检索有关 Kubernetes 集群的信息。
它可用于检索各种信息,包括 API 服务器 URL、Kubernetes 版本
例如,要检索有关 Kubernetes 集群的信息
kubectl cluster-info
kubectl apply -dry-run
kubectl apply --dry-run
命令用于模拟对 Kubernetes 资源更改的应用。它可用于模拟对各种资源(包括 Pod、服务、部署等)的更改。
kubectl apply -f deployment.yaml — dry-run
kubectl rollout undo
kubectl rollout undo 命令用于撤消 Kubernetes 资源的推出。它可用于撤消各种资源的推出,包括部署、副本集
kubectl rollout undo deployment/my-deployment
kubectl auth
kubectl auth 命令用于管理 Kubernetes 身份验证。它可用于管理各种身份验证设置,包括角色、角色绑定
kubectl auth can-i get pods —-as my-user
kubectl top
kubectl top 命令用于从 Kubernetes 资源中检索资源使用指标。它可用于从各种资源(包括节点、Pod 等)中检索指标
kubectl top pod my-pod
kubectl set
此命令用于更新或修改 Kubernetes 资源的状态。这是一个命令式命令,这意味着它直接指示 Kubernetes 执行操作,而不是声明所需的状态。
kubectl set image:此子命令用于更新部署或 Pod 使用的容器映像。
kubectl set env:此子命令用于更新 Pod 或部署的环境变量。
kubectl set resources:此子命令用于更新 Pod 或部署的资源请求和限制。
kubectl set replicas:此子命令用于更新部署的副本数。
kubectl set image deployment/my-deployment my-container=new-image:latest