Kubernetes技术极速入门(二)----初次交锋,请手下留情
使用Kubeadm部署kubernetes集群
1.硬件要求
主机名称 | CPU | MEM | 角色 | 系统 | 处理器数 |
---|---|---|---|---|---|
master1 | 2 | 2G | mater | CentOS7.5 | 2 |
worker1 | 2 | 2G | worker | CentOS7.5 | 2 |
worker2 | 2 | 2G | worker | CentOS7.5 | 2 |
1.5.镜像地址
1.8.观看菜鸡是咋弄的!
菜鸡感受:我太难了!
大家在初始化kubernetes之后,一定要记录用记事本等工具记录那些信息
2.主机准备
每天主机都采用最小化安装,100G磁盘,分区为/boot,/,ip地址范围为192.168.200.100~102。
3.修改主机名
hostnamectl set-hostname master1
hostnamectl set-hostname worker1
hostnamectl set-hostname worker2
4.修改网卡名(也可以不修改)
在开机界面,按下Tab,在quiet前添加配置,修改网卡名。
net.ifnames=0 biosdevname=0
上面配置的作用是更改网卡名为eth0开头,随后增加网卡为eth1,eth2递增
5.配置主机ip地址
我的网卡是ens33
#master1
vi /etc/sysconfig/network-scripts/ifcfg-ens33
修改成如下内容:(实际就2与倒数4行修改过)
TYPE="Ethernet"
BOOTPROTO="static"
DEFROUTE="yes"
PEERDNS="yes"
PEERROUTES="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_PEERDNS="yes"
IPV6_PEERROUTES="yes"
IPV6_FAILURE_FATAL="no"
NAME="eno16777736"
UUID="fdf61b61-318b-4634-b305-15fcbb72d968"
DEVICE="eno16777736"
ONBOOT="yes"
IPADDR=192.168.200.100
PREFIX="24"
GATEWAY="192.168.200.2"
DNS1="119.29.29.29"
重启网络
service network restart
#worker1
vi /etc/sysconfig/network-scripts/ifcfg-ens33
修改成如下内容:(实际就2与倒数4行修改过)
TYPE="Ethernet"
BOOTPROTO="static"
DEFROUTE="yes"
PEERDNS="yes"
PEERROUTES="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_PEERDNS="yes"
IPV6_PEERROUTES="yes"
IPV6_FAILURE_FATAL="no"
NAME="ens33"
UUID="fdf61b61-318b-4634-b305-15fcbb72d968"
DEVICE="ens33"
ONBOOT="yes"
IPADDR=192.168.200.101
PREFIX="24"
GATEWAY="192.168.200.2"
DNS1="119.29.29.29"
重启网络
service network restart
#worker2
vi /etc/sysconfig/network-scripts/ifcfg-ens33
修改成如下内容:(实际就2与倒数4行修改过)
TYPE="Ethernet"
BOOTPROTO="static"
DEFROUTE="yes"
PEERDNS="yes"
PEERROUTES="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_PEERDNS="yes"
IPV6_PEERROUTES="yes"
IPV6_FAILURE_FATAL="no"
NAME="ens33"
UUID="fdf61b61-318b-4634-b305-15fcbb72d968"
DEVICE="ens33"
ONBOOT="yes"
IPADDR=192.168.200.102
PREFIX="24"
GATEWAY="192.168.200.2"
DNS1="119.29.29.29"
重启网络
service network restart
6.配置域名解析(每台主机都要执行)
vi /etc/hosts
添加如下内容
192.168.200.100 master1
192.168.200.101 worker1
192.168.200.102 worker2
7.测试主机间的联通性
#master1
ping -c 4 worker2
ping -c 4 worker1
大家也可以测试worker1,worker2的联通性
8.关闭防火墙,selinux(每台主机都要执行)
1.停止防火墙
systemctl stop firewalld.service
2.配置防火墙开机禁用
systemctl disable firewalld.service
3.关闭selinux
sed -i "s/^SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
9.时间同步
方法一
配置NTP时间同步服务器,并启动时间同步
#master节点
1.下载ntp
yum -y install ntp
2.修改配置文件
vi /etc/ntp.conf
删除原有的server 0/1/2/3/4,并添加如下内容
server 127.127.1.0
fudge 127.127.1.0 stratum 10
3.开启ntp服务
systemctl restart ntpd
4.设置ntp服务的开机自启
systemctl enable ntpd
#worker节点(两台都要操作):
1.下载ntp客户端服务
yum -y install ntpdate
2.同步controller时间
ntpdate master1
方法二
安装ntpdate,使用阿里源时间同步(每台主机都需要执行)
yum -y install ntpdate
crontab -e
添加如下内容
0 */1 * * * ntpdate time1.aliyun.com
保存,退出
如果没同步成功
可使用如下命令
ntpdate time1.aliyun.com
查看时间
date
10.关闭swap分区
如果在之前分区时,选择的自动分区,则需要如下操作,都需要执行
vi /etc/fstab
将swap字段注释掉,保存退出
重启
reboot
查看分区
free -m
如果分区中swap分区容量变成0,则说明关闭成功。
11.配置主机网桥过滤(每台主机都要执行)
1.添加网桥过滤及地址转发
cat << EOF > /etc/sysctl.d/kubernetes.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward=1
EOF
2.从内核中加载br_netfilter模块(此模块需要centos7.5
以上吧!)
modprobe br_netfilter
3.查看是否加载
lsmod | grep br_netfilter
4.加载网桥过滤配置文件
sysctl -p /etc/sysctl.d/kubernetes.conf
12.开启ipvs(每台主机都要执行)
1.安装ipset和ipvsadm
yum -y install ipset ipvsadm
2.添加需要加载的模块
cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF
3.授权,运行,检查是否加载
chmod 755 /etc/sysconfig/modules/ipvs.modules && sh /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4
13.在master节点和worker节点安装指定版本的docker-ce(每台主机都要执行)
1.获取yum源(二选其一)
yum install -y wget
清华源
wget --no-check-certificate -O /etc/yum.repos.d/docker-ce.repo https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo
阿里源
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
2.查看yum源是否获取成功
ls /etc/yum.repos.d/
能看到docker-ce.repo就可以
3.查看docker-ce版本
yum list docker-ce.x86_64 --showduplicates | sort -r
4.安装指定版的docker-ce
yum -y install --setopt=obsoletes=0 docker-ce-18.06.3.ce-3.el7
5.检验docker安装是否成功
docker version
6.配置docker的开机自启
systemctl enable docker
7.开启docker服务
systemctl start docker
8.再次进行验证
docker version
90.修改配置文件1(其他版本可能需要,此实验版本不需要修改)
编写配置文件
vi /usr/lib/systrmd/system/docker.service
在service字段中ExecStart=/usr/bin/dockerd
后面-H后面的内容全部删掉(包含-H)
14.修改配置文件2(每台主机都要执行)
编写配置文件
vi /etc/docker/daemon.json
添加如下内容
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": ["https://cyowm7vy.mirror.aliyuncs.com"]
}
重启docker
systemctl restart docker
systemctl status docker
15.软件安装–yum源
#master1
默认YUM源为谷歌,可以使用阿里云YUM
1.安装yun源(阿里云)
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
2.检查yum是否可用,并进行验证
yum list | grep kubeadm
3.将yum源传输给worker主机
scp /etc/yum.repos.d/kubernetes.repo worker1:/etc/yum.repos.d/
scp /etc/yum.repos.d/kubernetes.repo worker2:/etc/yum.repos.d/
4.在worker主机进行验证
yum list | grep kubeadm
16.软件安装–kubeadm,kubelet,kubectl(每台主机都要执行)
yum install -y --setopt=obsoletes=0 kubeadm-1.17.2-0 kubelet-1.17.2-0 kubectl-1.17.2-0
17.kubelet的相关配置(每台主机都要执行)
修改配置文件
vi /etc/sysconfig/kubelet
dd删除原来的内容,再添加如下内容
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
设置开机自启
systemctl enable kubelet
不要启动它,它的配置文件在后面初始化后才有。
18.镜像准备(只在master节点执行)
1.显示所需要的镜像
kubeadm config images list
如
k8s.gcr.io/kube-apiserver:v1.17.17
k8s.gcr.io/kube-controller-manager:v1.17.17
k8s.gcr.io/kube-scheduler:v1.17.17
k8s.gcr.io/kube-proxy:v1.17.17
k8s.gcr.io/pause:3.1
k8s.gcr.io/etcd:3.4.3-0
k8s.gcr.io/coredns:1.6.5
编写镜像拉取的脚本
vi k8s.sh
images=(
kube-apiserver:v1.17.17
kube-controller-manager:v1.17.17
kube-scheduler:v1.17.17
kube-proxy:v1.17.17
pause:3.1
etcd:3.4.3-0
coredns:1.6.5
)
for imageName in ${images[@]} ; do
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName k8s.gcr.io/$imageName
docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
done
运行脚本
sh k8s.sh
查看拉取的镜像
docker images
19.kubernetes集群初始化(master节点执行)
1.master节点做集群初始化
kubeadm init \
--apiserver-advertise-address=192.168.200.100 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.17.2 \
--service-cidr=10.96.0.0/16 \
--pod-network-cidr=10.244.0.0/16
相关解释:
–apiserver-advertise-address #集群通告地址,填写Master的物理网卡地址
–kubernetes-version #K8s版本,与上面安装的一致
–pod-network-cidr #指定Pod IP的网段,flannel默认使用10.244.0.0/16
--service-cidr string # service所使用的网络,default "10.96.0.0/12"
注意:执行完初始化命令后,控制台上会有显示两条kubeadm join命令,
这两条命令分别用于添加master节点和添加node节点上执行,需要先保存这两条命令。
如果遇到什么文件存在,可尝试重置kubeadm
kubeadm reset
2.复制初始化的一些信息,保存到桌面
从[init] Using Kubernetes version: v1.17.2到最后
3.第一步
mkdir .kube
cp -i /etc/kubernetes/admin.conf .kube/config
ll .kube/config
4.第二步
安装网络插件,只在master节点操作即可
1.获取yml文件
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
于外网不好访问,如果出现无法访问的情况,可以直接用下面的 记得文件名是kube-flannel.yml
,
位置:/root/kube-flannel.yml
内容:https://github.com/flannel-io/flannel/tree/master/Documentation/kube-flannel.yml
2.修改kube-flannel.yml
在大约190左右,在kube-subnet-mgr
下新增一个
指定机器的网卡名(写网卡的时候,记得确认一下自己机器的网卡名是什么。)
vi kube-flannel.yml
我的网卡是ens33,就在kube-subnet-mgr
下面添加如下内容
- --iface=ens33
3.拉取flannel网络镜像(三台主机 )
docker pull quay.io/coreos/flannel:v0.14.0
查看仓库是否拉去下来
docker images
4.安装插件
kubectl create -f kube-flannel.yml
5.查看节点详细状态
kubectl get nodes -owide
节点已经为Ready状态,表示pod的网络已经创建成功。
若是集群状态一直是 notready,用下面语句查看原因,
journalctl -f -u kubelet.service
若原因是: cni.go:237] Unable to update cni config: no networks found in /etc/cni/net.d
创建目录给flannel做配置文件
mkdir -p /etc/cni/net.d
编写配置文件
vi /etc/cni/net.d/10-flannel.conf
{
"name":"cbr0",
"cniVersion":"0.3.1",
"type":"flannel",
"deledate":{
"hairpinMode":true,
"isDefaultGateway":true
}
}
5.第三步–添加worker节点(worker节点
执行)
直接复制之前提示要做的token
kubeadm join 192.168.200.100:6443 --token xn5s4e.2hl6wg5gf4ahpmwo \
--discovery-token-ca-cert-hash sha256:fcc08d7b8251d55d655ad406c7de17093829646667aa9340cfde1b252c392100
6.在master节点查看节点状态
kubectl get nodes
可以发现集群的状态已经是Ready
如果,长时间没起来,可以重启一下网络插件
kubectl apply -f kube-flannel.yml
20.验证Kubernetes集群可用性
1.查看节点状态
kubectl get nodes
2.查看集群健康状态
kubectl get cs
或
kubectl cluster-info
3.检查pod的状态(确保所有的都是Running
)
kubectl get pods --namespace kube-system
21.测试Kubernetes----部署nginx应用
1.安装nginx服务
kubectl run test-nginx --image=nginx:alpine
2.验证安装
kubectl get pods -o wide --watch
1.status,可以直观的看到目前容器的情况;
2.ip,为flannel网络的ip,为内部局域网;
3.node,所属节点
4.访问nginx,可以直接访问集群中的局域网IP,也就是flannel创建的IP
3.验证应用使用情况
curl 10.244.1.2
这里的10.244.1.2是我在上面得到的局域网ip
4.验证节点运行情况
查看nginx容器是不是运行在上面指定的某个节点
在worker节点
都执行以下命令,
docker ps | grep test
可以明确的看见,在指定节点上的容器里面多了两个test相关的容器
22.使用deployment部署nginx应用
这里先创建一个deployment资源,该资源是k8s部署应用的重点。
创建deployment资源后,deployment指示k8s如何创建应用实例,k8s-master将应用程序,调度到具体的node上,也就是生成pod以及内部的容器实例。
应用创建后,deployment会持续监控这些pod,如果node节点出现故障,deployment控制器会自动找到更优的node,重新创建新的实例,这就提供了自我修复能力,解决服务器故障问题。
创建k8s资源有两种方式
yaml配置文件,生产环境使用
命令行,调试使用
1.创建yaml,应用yaml
vi test2-nginx.yaml
添加如下内容:
apiVersion: apps/v1
kind: Deployment
metadata:
name: test2-nginx
labels:
app: nginx
spec:
#创建2个nginx容器
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:alpine
ports:
- containerPort: 80
2.开始创建
kubectl apply -f test2-nginx.yaml
3.验证deployment资源是否创建成功
kubectl get pods -o wide
4.验证应用使用情况
curl 10.244.1.3
curl 10.244.2.2
这里的10.244.1.3,10.244.2.2
是我在上面得到的局域网ip
23.service
service是k8s中的一个重要概念,主要是提供负载均衡和服务自动发现。
问题又回到一开始了,使用deployment创建的nginx已经运行成功了。那么外部应该如何访问到这个nginx?
pod IP仅仅是集群内可见的虚拟IP,外部无法访问。pod IP会随着pod 的销毁而消失,当ReplicaSet对pod进行动态伸缩时,pod IP可能随时随地的都会改变,这样就会增加访问这个服务的难度.
因此,通过pod的IP去访问服务,基本上是不现实的,解决方案就是使用新的资源,(service)负载均衡资源
1.指定了deployment为test2-nginx ,端口为80,标签为LoadBalancer
kubectl expose deployment test2-nginx --port=80 --type=LoadBalancer
2.查看所有的deployment
kubectl get deployment
3.查看所有的service的详细信息
kubectl get services -o wide
这样我们就可以直接访问这个端口,就能够访问到这个pod内的应用。
4.浏览器输入如下内容
192.168.200.100:端口号
24.配置kubectl命令补全
yum install -y bash-completion
source /usr/share/bash-completion/bash_completion
source <(kubectl completion bash)
echo "source <(kubectl completion bash)" >> ~/.bashrc
25.部署kubernetes 仪表盘–dashboard
kubernetes 仪表盘是kubernetes集群的通用、基于web的UI。它允许用户管理集群中运行应用程序并对其进行故障排除,以及管理集群本事。
1.下载recommended.yaml,实力允许的话,可以自己编写。
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0/aio/deploy/recommended.yaml
2.修改recommended.yaml文件
vi recommended.yaml
添加一下node的类型与端口
39 spec:
40 type: NodePort
41 ports:
42 - port: 443
43 nodePort: 30001
44 targetPort: 8443
45 selector:
46 k8s-app: kubernetes-dashboard
3.开始创建recommended
kubectl apply -f recommended.yaml
4.查看所属node以及端口
kubectl -n kubernetes-dashboard get pod,svc -o wide
5.浏览器访问
192.168.200.101:30001
6.创建并修改create-admin.yaml文件
vi create-admin.yaml
添加内容如下
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kubernetes-dashboard
7.开始创建
kubectl apply -f create-admin.yaml
获取用户token
kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep admin-user | awk '{print $1}')
8.在之前的界面把获取的token值输入进去
9.删除dashboard
kubectl delete -f create-admin.yaml
kubectl delete -f recommended.yaml
10.启动dashboard
kubectl apply -f recommended.yaml
kubectl apply -f create-admin.yaml
其他博客:
Kubernetes技术极速入门(一)---- 初次见面,请多多关照
Kubernetes技术极速入门(三)---- 我有神器,能赢不
Kubernetes技术极速入门(四)---- 太强了,干不过
Kubernetes技术极速入门(五)----再来,我必定胜你
Kubernetes技术极速入门(六)---- 我搬救兵,等我回来
Kubernetes技术极速入门(七)---- 我又带了把神器
Kubernetes技术极速入门(八)---- 挥挥手,不带走一片云彩
感谢大家,点赞,收藏,关注,评论!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?