| 主机名称 | CPU | MEM | 角色 | 系统 | 处理器数 |
|---|---|---|---|---|---|
| master1 | 2 | 2G | mater | CentOS7.5 | 2 |
| worker1 | 2 | 2G | worker | CentOS7.5 | 2 |
| worker2 | 2 | 2G | worker | CentOS7.5 | 2 |
下载传送门
1.8.观看菜鸡是咋弄的!传送阵
菜鸡感受:我太难了!
大家在初始化kubernetes之后,一定要记录用记事本等工具记录那些信息
每天主机都采用最小化安装,100G磁盘,分区为/boot,/,ip地址范围为192.168.200.100~102。
3.修改主机名hostnamectl set-hostname master1 hostnamectl set-hostname worker1 hostnamectl set-hostname worker24.修改网卡名(也可以不修改)
在开机界面,按下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 restart6.配置域名解析(每台主机都要执行)
vi /etc/hosts
添加如下内容
192.168.200.100 master1 192.168.200.101 worker1 192.168.200.102 worker27.测试主机间的联通性
#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/config9.时间同步 方法一
配置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
查看时间
date10.关闭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.conf12.开启ipvs(每台主机都要执行)
1.安装ipset和ipvsadm
yum -y install ipset ipvsadm
2.添加需要加载的模块
cat > /etc/sysconfig/modules/ipvs.modules <3.授权,运行,检查是否加载
chmod 755 /etc/sysconfig/modules/ipvs.modules && sh /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv413.在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.repo2.查看yum源是否获取成功
ls /etc/yum.repos.d/能看到docker-ce.repo就可以
3.查看docker-ce版本yum list docker-ce.x86_64 --showduplicates | sort -r4.安装指定版的docker-ce
yum -y install --setopt=obsoletes=0 docker-ce-18.06.3.ce-3.el75.检验docker安装是否成功
docker version6.配置docker的开机自启
systemctl enable docker7.开启docker服务
systemctl start docker8.再次进行验证
docker version90.修改配置文件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 docker15.软件安装–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 EOF2.检查yum是否可用,并进行验证
yum list | grep kubeadm3.将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 kubeadm16.软件安装–kubeadm,kubelet,kubectl(每台主机都要执行)yum install -y --setopt=obsoletes=0 kubeadm-1.17.2-0 kubelet-1.17.2-0 kubectl-1.17.2-017.kubelet的相关配置(每台主机都要执行)修改配置文件
vi /etc/sysconfig/kubeletdd删除原来的内容,再添加如下内容
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.shimages=( 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 images19.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节点上执行,需要先保存这两条命令。如果遇到什么文件存在,可尝试重置kubeadmkubeadm reset2.复制初始化的一些信息,保存到桌面
从[init] Using Kubernetes version: v1.17.2到最后3.第一步
mkdir .kube cp -i /etc/kubernetes/admin.conf .kube/config ll .kube/config4.第二步
安装网络插件,只在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.yml2.修改kube-flannel.yml
在大约190左右,在kube-subnet-mgr下新增一个
指定机器的网卡名(写网卡的时候,记得确认一下自己机器的网卡名是什么。)vi kube-flannel.yml我的网卡是ens33,就在kube-subnet-mgr下面添加如下内容
- --iface=ens333.拉取flannel网络镜像(三台主机 )
docker pull quay.io/coreos/flannel:v0.14.0查看仓库是否拉去下来
docker images4.安装插件
kubectl create -f kube-flannel.yml5.查看节点详细状态
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节点执行)
直接复制之前提示要做的tokenkubeadm join 192.168.200.100:6443 --token xn5s4e.2hl6wg5gf4ahpmwo --discovery-token-ca-cert-hash sha256:fcc08d7b8251d55d655ad406c7de17093829646667aa9340cfde1b252c3921006.在master节点查看节点状态
kubectl get nodes可以发现集群的状态已经是Ready
如果,长时间没起来,可以重启一下网络插件kubectl apply -f kube-flannel.yml20.验证Kubernetes集群可用性1.查看节点状态
kubectl get nodes2.查看集群健康状态
kubectl get cs或
kubectl cluster-info3.检查pod的状态(确保所有的都是Running)
kubectl get pods --namespace kube-system21.测试Kubernetes----部署nginx应用1.安装nginx服务
kubectl run test-nginx --image=nginx:alpine2.验证安装
kubectl get pods -o wide --watch1.status,可以直观的看到目前容器的情况; 2.ip,为flannel网络的ip,为内部局域网; 3.node,所属节点 4.访问nginx,可以直接访问集群中的局域网IP,也就是flannel创建的IP3.验证应用使用情况
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,应用yamlvi 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: 802.开始创建
kubectl apply -f test2-nginx.yaml3.验证deployment资源是否创建成功
kubectl get pods -o wide4.验证应用使用情况
curl 10.244.1.3 curl 10.244.2.2这里的10.244.1.3,10.244.2.2是我在上面得到的局域网ip
23.serviceservice是k8s中的一个重要概念,主要是提供负载均衡和服务自动发现。
问题又回到一开始了,使用deployment创建的nginx已经运行成功了。那么外部应该如何访问到这个nginx?
pod IP仅仅是集群内可见的虚拟IP,外部无法访问。pod IP会随着pod 的销毁而消失,当ReplicaSet对pod进行动态伸缩时,pod IP可能随时随地的都会改变,这样就会增加访问这个服务的难度.
因此,通过pod的IP去访问服务,基本上是不现实的,解决方案就是使用新的资源,(service)负载均衡资源
1.指定了deployment为test2-nginx ,端口为80,标签为LoadBalancerkubectl expose deployment test2-nginx --port=80 --type=LoadBalancer2.查看所有的deployment
kubectl get deployment3.查看所有的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)" >> ~/.bashrc25.部署kubernetes 仪表盘–dashboardkubernetes 仪表盘是kubernetes集群的通用、基于web的UI。它允许用户管理集群中运行应用程序并对其进行故障排除,以及管理集群本事。
1.下载recommended.yaml,实力允许的话,可以自己编写。wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0/aio/deploy/recommended.yaml2.修改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-dashboard3.开始创建recommended
kubectl apply -f recommended.yaml4.查看所属node以及端口
kubectl -n kubernetes-dashboard get pod,svc -o wide5.浏览器访问
192.168.200.101:300016.创建并修改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-dashboard7.开始创建
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.yaml10.启动dashboard
kubectl apply -f recommended.yaml kubectl apply -f create-admin.yaml感谢大家,点赞,收藏,关注,评论!



