k8s职责

  • 自动化容器部署和复制
  • 随时扩展或收缩容器
  • 容器分组group,并且提供容器间的负载均衡
  • 实时监控,即时故障发现,自动替换

k8s概念及架构

  • pod
    pod是容器的容器,可以包含多个container
    pod是k8s最小可部署单元,一个pod就是一个进程
    pod内部容器网络互通,每个pod都有独立虚拟IP
    pod都是部署完整的应用或模块(项目中通常:一个pod部署一个应用,或部署一个应用的一部分)
  • pause 每个Pod里运行着一个特殊的被称之为Pause的容器,其他容器则为业务容器,这些业务容器共享Pause容器的网络栈和Volume挂载卷,因此他们之间通信和数据交换更为高效,在设计时我们可以充分利用这一特性将一组密切相关的服务进程放入同一个Pod中。同一个Pod里的容器之间仅需通过localhost就能互相通信。(摘自:https://www.cnblogs.com/guigujun/p/10556508.html)
    在这里插入图片描述

在这里插入图片描述

k8s安装

1、设置时区

timedatectl set-timezone Asia/Shanghai

2、设置主机名和映射
3、关闭防火墙,生产环境是不能关闭的
分别指行

sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
setenforce 0 #临时生效
systemctl disable firewalld #关闭防火墙
systemctl stop firewalld #停止防火墙

4、kubeadm 本身不是k8s,而是一个部署工具,简化部署工作

#创建安装目录
mkdir /usr/local/k8s-install


#上传安装包
#本地安装
yum localinstall -y *.rpm


#安装docker
systemctl start docker 
systemctl enable docker #自动自动
docker info | grep cgroup #查看容器组,如不是cgroupfs则需要设置
cat << EOF > /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver-cgroupfs"]
}
EOF


#安装kubeadm
#关闭交换区,交换区相对与虚拟内存。
swapoff -a
vi /etc/fstab 
#注释掉/dev/mapper/contos-swap 

#配置网桥
$ cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1net.bridge.bridge-nf-call-iptables = 1
EOF
#查看是否配置成功
sysctl --system
# 以下配置为1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-arptables = 1
#通过镜像安装k8s,docker load 加载本地镜像,并在docker中创建
docker load -i /root/install/njnu-ly/ly-web.tar
docker load -i flannel-dashboard.tar.tz

k8s安装成功
在这里插入图片描述

kubeadm/kubelet/kubectl区别

kubeadm是k8s集群快速构建工具。
kubelet运行在所有的节点上,负责启动pod和容器,以系统服务形式出现。
kubectl:kubectl是命令行工具,提供指令。
启动节点命令:

systemctl start kubelet
systemctl enable kubelet #设置开机自启

kubeadm创建集群

1、初始化master

kubeadm init  --kubernetes-version v1.19.0  --pod-network-cidr=10.244.0.0/16 #虚拟ip的边界

#执行完成后会提示执行三行代码,复制运行即可

#构建集群,在其它节点运行即可构建集群

kubeadm join 192.168.72.130:6443 --token uptlib.s7ohn71clco080y0 \
    --discovery-token-ca-cert-hash sha256:c9a4d462d02825644872e7365f9caa144576390785466285b797f7d7e5e2b3a9 

#查看节点及状态

kubectl get nodes
kubectl get pod --all-namespaces #获取所有的pod
#CrashLoopBackOff 创建失败,自动循环创建,长时间不能解决增加cpu资源即可

2、安装网络插件flannel
service:服务分组
kube-proxy:代理组件
flannel:通信协议,数据格式

kubectl create -f kube-flannel.yml

3、查看令牌列表(忘记join命令时使用)

kubeadm token list #令牌列表
kubeadm join  192.168.72.130:6443 --token uptlib.s7ohn71clco080y0  --discovery-token-unsafe-skip-ca-verification #不进行token,校验

dashboard仪表盘

kubectl apply -f kubernetes-dashboard.yaml
kubectl apply -f admin-role.yaml
kubectl apply -f kubernetes-dashboard-admin.rbac.yaml

在这里插入图片描述

dashboard部署(以tomcat为例)

首先需要配置镜像加速,否则可能导致镜像无法下载
在这里插入图片描述
在这里插入图片描述
k8s会主动拉取镜像并创建容器运行。
注:端口为pod暴露的端口,目标端口为Tomcat暴露端口

Service服务暴露

在这里插入图片描述
外部请求访问端口32500,再由service进行负载均衡转发。
创建服务,与Tomcat进行绑定

vim tomcat-service.yml #创建yml文件
apiVersion v1
kind : Service
metadata :
	name:tomcat-service
	labels :
		app: tomcat-service
#绑定服务
spec:
	type:NodePort
	selector:
		app:tomcat-cluster
	ports:
	-port : 8000
	targetPort : 8080 #如上图,Tomcat端口
	nodePort:32500 #节点端口,和容器的端口进行映射
kubectl create -f ./tomcat-service.yml #创建服务
kubectl get service #获取服务
kubectl describe service tomcat-service

访问:ip : 32500即可访问服务

NFS集群共享

1、概念
network file system:是由sun公司研制的文件传输协议
NFS采用远程过程调用RPC机制实现文件传输
在这里插入图片描述

2、安装

yum install -y nfs-utils rpcbind #安装领个插件

3、创建共享目录

mkdir -p /usr/local/data
vim /etc/exports #设置暴露的共享文件
内容:/usr/local/data ip/24 (rw,sync) #这个文件可读可写,sync同步
ip为master的ip,24为掩码

4、启动服务

systemctl start nfs.service
systemctl start rpcbind.service
systemclt enable nfs.service #开机自启
systemclt enable rpcbind.service #开机自启

5、使用文件节点安装

yum install -y nfs-utils

6、查看共享文件夹

showmount -e 192.168.163.132

7、然后挂载到此共享目录即可

mount 192.168.163.132 : /usr/local/data /mnt #mnt为本地挂载目录

8.将pod中的目录映射到mnt
修改yml配置文件

spec:
	volumes:
	- name : web-app
	  hostPath:
	 	path:/mnt #共享目录
	containers:
	- name:tomcat-cluster
	  image:tomcat:latest
	  ports:
	  - containerPort : 8080
	  volumeMounts:
	  - name:web-app #与上面-name web-app保持一直
	    mountPath:/usr/local/tomcat/webapps
	type:NodePort #弊端需要指导节点的ip
	selector:
		app:tomcat-cluster
	ports:
	- port : 8000
	targetPort : 8080 #如上图,Tomcat端口
	nodePort:32500 #节点端口,和容器的端口进行映射

注释这两行,表示所有的数据都由8000端口进行接收

type:NodePort 
nodePort:32500 
但是此时外部要访问应用需要进行端口转发,参考Service提供负载均衡实现部分

9、主服务器全局观察文件

kubectl get pod -o wide
kubectl exec -it podname #进入pod查看

10、项目实战文件

在这里插入代码片

Service提供负载均衡实现

1、端口转发工具Rinetd

  • Rinetd是linux操作系统中为重定向传输控制协议的工具。
  • 可将源IP端口数据转发至目标端口IP端口。
  • 在kubernetes中用于将service服务对外暴露。
wget http://www.boutell.com/rinetd/http/rinetd.tar.gz #源码包,需要gcc编译
sed -i 's/65536/65535/g' rinetd.c
yum install -y gcc
make && make install
#修改配置文件
vim /etc/rinetd.conf 
#添加内容
0.0.0.0 8000 10.100.22.231 8000 #0.0.0.0表示所有的ip
#加载配置文件
rinetd -c /etc/rinetd.conf
netstat -tulpn #查看主机暴露的端口

更新配置集群及资源限定

1、更新配置

kubectl apply -f 

2、资源限定

containers:
	- name:tomcat-cluster
	  image:tomcat:latest
	  resources :
		requests: #资源需求
			cpu :1 #单位核,可以为小数
			memory:500Mi
		limits: #资源限制
			cpu : 2 #不允许超过两核
			memory : 1024Mi

3、部署策略
资源限制
由部署者指定

常用命令

kubectl get deployment #查看部署
kubectl delete deployment tomcat-deploy #删除部署,部署删除后对应的pod也会删除
kubectl delete service tomcat-service #删除服务
docker load -i /root/install/njnu-ly-installer/njnu-ly/ly-web.tar #加载本地镜像
docker save -o  /root/install/images/njnu-ly/ web-app-test-ly.tar njnu-lyr/web-app-test-ly:latest #将镜像保存为tar,导出
scp -r ly-web.tar ip:/root/install/njnu-ly-installer/njnu-ly #远程拷贝
kubectl rollout restart deployment -n 命名空间 #重启所有

注:文章命令和图片,文字大部分来源于马士兵教育网络课程笔记

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐