podSubnet(pod 网段) 10.244.0.0/16
serviceSubnet(service 网段): 10.10.0.0/16
服务器ip(主机网段):10.30.0.0/16
注意:pod、service、主机ip不能在同一网段
实验环境规划:
操作系统:centos7.8
配置: 4Gib 内存/2vCPU/100G 硬盘
#在主节点上执行
[root@test-0020 ~]# hostnamectl set-hostname k8s-master && bash
#在工作节点node1上执行
[root@test-0021 ~]# hostnamectl set-hostname k8s-node1 && bash
#在工作节点node2上执行
[root@test-0022 ~]# hostnamectl set-hostname k8s-node2 && bash
三台节点都需要添加
[root@k8s-master ~]# vim /etc/hosts
10.30.11.180 k8s-master
10.30.11.181 k8s-node1
10.30.11.182 k8s-node2
#三台节点都需要做
[root@k8s-master ~]# ssh-keygen #一路回车,不输入密码
#把本地生成的密钥文件和私钥文件拷贝到远程主机
[root@k8s-master ~]# ssh-copy-id -i k8s-master
[root@k8s-master ~]# ssh-copy-id -i k8s-node1
[root@k8s-master ~]# ssh-copy-id -i k8s-node2
#临时关闭,三台节点都需要做
[root@k8s-master ~]# swapoff -a
#永久关闭:注释 swap 挂载,给 swap 这行开头加一下注释
[root@k8s-master ~]# vim /etc/fstab
#/dev/mapper/centos-swap swap swap defaults 0 0
三台节点都需要做
[root@k8s-master ~]# modprobe br_netfilter
[root@k8s-master ~]# echo "modprobe br_netfilter" >> /etc/profile
[root@k8s-master ~]# vim /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
[root@k8s-master ~]# sysctl -p /etc/sysctl.d/k8s.conf
三台节点都需要做
[root@k8s-master ~]# systemctl stop firewalld && systemctl disable firewalld
#修改 selinux 配置文件之后,重启机器,selinux 配置才能永久生效
[root@k8s-master ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
三台节点都需要配置
#安装 wget 命令
[root@k8s-master ~]# yum -y install wget
#备份基础 repo 源
[root@k8s-master ~]# mkdir /root/repo.bak
[root@k8s-master ~]# mv /etc/yum.repos.d/* /root/repo.bak
#下载阿里云的 repo 源
[root@k8s-master ~]# wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
[root@k8s-master ~]# wget -O /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo
#配置国内阿里云 docker 的 repo 源
[root@k8s-master ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#配置安装 k8s 组件需要的阿里云的 repo 源
[root@k8s-master ~]# vim /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
#运行 yum makecache 生成缓存
[root@k8s-master ~]# yum makecache
三台节点都需要配置
#安装 ntpdate 命令
[root@k8s-master ~]# yum install ntpdate -y
#跟网络时间做同步
[root@k8s-master ~]# ntpdate cn.pool.ntp.org
#把时间同步做成计划任务
[root@k8s-master ~]# crontab -e
* */1 * * * /usr/sbin/ntpdate cn.pool.ntp.org
#重启 crond 服务
[root@k8s-master ~]# systemctl restart crond.service
三台节点都需要配置
[root@k8s-master ~]# vim /etc/sysconfig/modules/ipvs.modules
#!/bin/bash
ipvs_modules="ip_vs ip_vs_lc ip_vs_wlc ip_vs_rr ip_vs_wrr ip_vs_lblc ip_vs_lblcr ip_vs_dh ip_vs_sh ip_vs_nq ip_vs_sed ip_vs_ftp nf_conntrack"
for kernel_module in ${ipvs_modules}; do
/sbin/modinfo -F filename ${kernel_module} > /dev/null 2>&1
if [ 0 -eq 0 ]; then
/sbin/modprobe ${kernel_module}
fi
done
[root@k8s-master ~]# chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep ip_vs
三台节点都需要安装
[root@k8s-master ~]# yum install -y yum-utils device-mapper-persistent-data lvm2 net-tools nfs-utils lrzsz gcc gcc-c++ make cmake libxml2-devel openssl-devel curl curl-devel unzip sudo ntp libaio-devel vim ncurses-devel autoconf automake zlib-devel python-devel epel-release openssh-server socat ipvsadm conntrack ntpdate telnet ipvsadm
三台节点都需要安装
[root@k8s-master ~]# yum install docker-ce-20.10.6 docker-ce-cli-20.10.6 containerd.io -y
[root@k8s-master ~]# systemctl start docker && systemctl enable docker.service && systemctl status docker.service
三台节点都需要配置
[root@k8s-master ~]# vim /etc/docker/daemon.json
{
"registry-mirrors":["https://rsbud4vc.mirror.aliyuncs.com","https://registry.docker-cn.com","https://docker.mirrors.ustc.edu.cn","https://dockerhub.azk8s.cn","http://hub-mirror.c.163.com","http://qtid6917.mirror.aliyuncs.com", "https://rncxm540.mirror.aliyuncs.com"], "exec-opts": ["native.cgroupdriver=systemd"]
}
#修改 docker 文件驱动为 systemd,默认为 cgroupfs,kubelet 默认使用 systemd,两者必须一致才可以。
[root@k8s-master ~]# systemctl daemon-reload && systemctl restart docker && systemctl status docker
三台节点都需要安装
[root@k8s-master ~]# yum install -y kubelet-1.20.6 kubeadm-1.20.6 kubectl-1.20.6
[root@k8s-master ~]# systemctl enable kubelet && systemctl status kubelet
#上面可以看到 kubelet 状态不是 running 状态,这个是正常的,不用管,等 k8s 组件起来这个 kubelet 就正常了。
注:每个软件包的作用
Kubeadm: kubeadm 是一个工具,用来初始化 k8s 集群的
kubelet: 安装在集群所有节点上,用于启动 Pod 的
kubectl: 通过 kubectl可以部署和管理应用,查看各种资源,创建、删除和更新各种组件
#把初始化 k8s 集群需要的离线镜像包上传到 三台机器上,手动解压(没有包的,可以忽略不做)
[root@k8s-master ~]# docker load -i k8simage-1-20-6.tar.gz
#使用 kubeadm 初始化 k8s 集群
[root@k8s-master ~]# kubeadm init --kubernetes-version=1.20.6 --apiserver-advertise-address=10.30.11.180 --image-repository registry.aliyuncs.com/google_containers --pod-network-cidr=10.244.0.0/16 --ignore-preflight-errors=SystemVerification
注:–image-repository registry.aliyuncs.com/google_containers:手动指定仓库地址为
registry.aliyuncs.com/google_containers。kubeadm 默认从 k8s.grc.io 拉取镜像,但是
k8s.gcr.io 访问不到,所以需要指定从 registry.aliyuncs.com/google_containers仓库拉取镜像。
kubeadm join 10.30.11.180:6443 --token pyfcsa.h2bbcgr67d1xt5hg
- -discovery-token-ca-cert-hash sha256:6ebd3797f8550e089968b23f2ca5b457c67c77768fe86e8b1ca0eddd3017cba6
#上面命令是把 node 节点加入集群,需要保存下来,每个人的都不一样
#配置 kubectl 的配置文件 config,相当于对 kubectl 进行授权,这样 kubectl 命令可以使用这个证书对 k8s 集群进行管理
[root@k8s-master ~]# mkdir -p $HOME/.kube
[root@k8s-master ~]# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@k8s-master ~]# chown $ (id -u):$(id -g) $HOME/.kube/config
[root@k8s-master ~]# kubectl get nodes
#此时集群状态还是 NotReady 状态,因为没有安装网络插件。
在 k8s-master上查看加入节点的命令
[root@k8s-master ~]# kubeadm token create --print-join-command
把 k8s-node1和 k8s-node2 加入 k8s 集群:
在k8s-node1上执行命令
[root@k8s-node1 ~]# kubeadm join 10.30.11.180:6443 --token iel0ae.sno2znw28v5kup2k --discovery-token-ca-cert-hash sha256:6ebd3797f8550e089968b23f2ca5b457c67c77768fe86e8b1ca0eddd3017cba6
在k8s-node2上执行命令
[root@k8s-node2 ~]# kubeadm join 10.30.11.180:6443 --token iel0ae.sno2znw28v5kup2k --discovery-token-ca-cert-hash sha256:6ebd3797f8550e089968b23f2ca5b457c67c77768fe86e8b1ca0eddd3017cba6
k8s-master上查看集群节点状况
[root@k8s-master ~]# kubectl get nodes
注意:上面状态都是 NotReady 状态,说明没有安装网络插件
可以看到 k8s-node1、k8s-node2 的 ROLES 角色为空,<none>就表示这个节点是工作节点。
可以把 k8s-node1 和 k8s-node2 的 ROLES 变成 work,按照如下方法:
[root@k8s-master ~]# kubectl label node k8s-node1 node-role.kubernetes.io/worker=worker
[root@k8s-master ~]# kubectl label node k8s-node2 node-role.kubernetes.io/worker=worker
下载 calico.yaml 到 k8s-master上,使用 yaml 文件安装 calico 网络插件
calico.yaml私我单发
[root@k8s-master ~]# kubectl apply -f /etc/kubernetes/calico/calico.yaml
查看calico的pod状态 #STATUS 状态是 Ready,说明 k8s 集群正常运行了
[root@k8s-master ~]# kubectl get pod -n kube-system
[root@k8s-master ~]# vim tomcat.yaml
apiVersion: v1 #pod属于k8s核心组v1
kind: Pod #创建的是一个Pod资源
metadata: #元数据
name: demo-pod #pod名字
namespace: default #pod所属的名称空间
labels:
app: myapp #pod具有的标签
env: dev #pod具有的标签
spec:
containers: #定义一个容器,容器是对象列表,下面可以有多个name
- name: tomcat-pod-java #容器的名字
ports:
- containerPort: 8080
image: tomcat:8.5-jre8-alpine #容器使用的镜像
imagePullPolicy: IfNotPresent
[root@k8s-master ~]# kubectl apply -f tomcat.yaml
[root@k8s-master ~]# kubectl get pods
[root@k8s-master ~]# vim tomcat-service.yaml
apiVersion: v1
kind: Service
metadata:
name: tomcat
spec:
type: NodePort
ports:
- port: 8080
nodePort: 30080
selector:
app: myapp
env: dev
[root@k8s-master ~]# kubectl apply -f tomcat-service.yaml
[root@k8s-master ~]# kubectl get svc
在浏览器访问 k8s-node1 节点的 ip:30080 即可请求到浏览器
哪里有问题随时沟通哦