目录
1、环境准备
1.1、服务器准备
1.2、服务器hostname设置
1.3、添加hosts 网络主机配置,三台虚拟机都要设置
1.4、关闭防火墙,三台虚拟机都要设置,生产环境跳过这一步
2、安装docker,3台服务器都安装
3、安装kubeadmin加载k8s镜像
3.1、添加kubernetes yum源
3.2、查看kubeadm版本
3.3、下载
3.4、下载后,进入kubernetes包,发现kubectl和kubelet存在1.24.1版本
3.4.1 删除1.24.1版本
3.4.2 下载kubelet-1.15.6
3.4.3 下载kebectl-1.15.6
3.5、安装kubeadmin组件
3.6、设置kebelet的开机启动
3.7、拉取镜像
3.7.1、查看需要依赖哪些镜像
3.7.2、拉取镜像
3.7.3 tag一下镜像
3.7.4 拉取flannel和kubernetes-dashboard-amd64
3.7.5 以下步骤逐一执行
3.8 以上从3.1到3.7的每一个步骤在每台服务器上都操作一次
4 创建k8s集群
4.1 kubeadmin/kubelet/kubectl的区别
4.2 master主服务器创建
4.3 执行要求执行的命令
如果上面的token忘记了,可以通过以下命令获取:
编辑
4.4 安装flannel组件
4.5 从节点加入集群
5 kubernetes-dashboard安装
5.1 拉取dashboard镜像
6 Deployment部署
6.1 Deployment部署脚本范本
6.2 与部署相关的常用命令
6.3 本地部署一个tomcat
7 基于NFS的文件共享
7.1 master节点安装NFS
7.2 创建文件共享目录
7.3 配置文件共享配置
7.4 启动NFS服务
7.5 启动rpc服务
7.6 查看exports配置是否生效
7.7 节点安装NFS
7.8 从节点服务器上查看主服务器上对外共享的挂载文件夹
7.9 挂载主机共享文件目录到从节点本机的映射目录
7.10 设置节点服务器nfs为开机启动
7.11 其他从节点重复7.7-7.10的步骤安装nfs
8 利用nfs系统部署tomcat
8.1 删除以前部署的tomcat
8.2 重新编辑tomcat deploy的yml文件
8.3 创建部署文件
9 利用Rinetd实现Service负载均衡-端口转发工具Rinetd
9.1 重新编辑/local/k8s/tomcat-service下的tomcat-service.yml文件
9.2 重新创建tomcat-service.yml
9.3 查看tomcat-service
9.4 nfs对外暴漏的共享文件下存放web文件
9.5 端口转发工具Rinetd
9.5.1 Rinetd工具安装
10 K8S部署调整命令
10.1 资源限定
参考:kubernetes 集群安装,离线版 - 简书 (jianshu.com)
docker的卸载:(61条消息) Docker 安装和卸载详细步骤_北漂编程小王子的博客-CSDN博客_卸载docker
一主二从架构:
master主机:192.168.56.110
node1服务器:192.168.56.111
node2服务器:192.168.56.112
timedatectl set-timezone Asia/Shanghai #服务器都要执行
hostnamectl set-hostname master #110执行
hostnamectl set-hostname node1 #111执行
hostnamectl set-hostname node2 #112执行
vim /etc/hosts
#主从节点服务器主机名和上面设置的主机名要一致,
192.168.56.110 master
192.168.56.111 node1
192.168.56.112 node2
三个节点直接互相通过:ping 主机名 能ping同。如在master上:ping node1
学习环境可以这样设置,生产环境不要这样设置,避免因为防火墙原因造成访问不通问题:
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
setenforce 0
systemctl disable firewalld
systemctl stop firewalld
#重启网卡
service network restart
如图:
注意安装版本选18.09.5。
参考地址:(61条消息) docker-安装docker_荆茗Scaler的博客-CSDN博客_docker 安装docker
由于kubeadm是依赖kubelet, kubectl的,所以我们只需要下载kubeadm的rpm,其依赖就自动下载下来了。但是版本可能不是我们想要的,所以可能需要单独下载。比如我下载kubeadm-1.15.6,它依赖的可能是kubelet-1.16.x。
cat > /etc/yum.repos.d/kubernetes.repo <
yum list kubeadm --showduplicates
...
kubeadm.x86_64 1.15.6-0
...
yum install --downloadonly --downloaddir ~/k8s/kubernetes kubeadm-1.15.6
rm -f 17013403794d47f80ade3299c74c3a646d37f195c1057da4db74fd3fd78270f1-kubectl-1.24.1-0.x86_64.rpm
rm -f d184b7647df76898e431cfc9237dea3f8830e3e3398d17b0bf90c1b479984b3f-kubelet-1.24.1-0.x86_64.rpm
yum install --downloadonly --downloaddir ~/k8s/kubernetes kubelet-1.15.6
yum install --downloadonly --downloaddir ~/k8s/kubernetes kubectl-1.15.6
yum install ~/k8s/kubernetes/*.rpm
我们并不需要启动kubelet,就算启动,也是不能成功的。执行kubeadm命令,会生成一些配置文件 ,这时才会让kubelet启动成功的。
systemctl enable kubelet
执行kubeadm时,需要用到一些镜像,我们需要提前准备。
kubeadm config images list
在生产环境,是肯定访问不了k8s.gcr.io这个地址的。在有大陆联网的机器上,也是无法访问的。所以我们需要使用国内镜像先下载下来。
解决办法很简单,我们使用docker命令搜索下:
docker search kube-apiserver
一般选择星级别高的,即STARTS多的。
docker pull aiotceo/kube-apiserver:v1.15.6
docker pull aiotceo/kube-controller-manager:v1.15.6
docker pull aiotceo/kube-scheduler:v1.15.6
docker pull aiotceo/kube-proxy:v1.15.6
docker pull aiotceo/pause:3.1
docker pull aiotceo/etcd:3.3.10
docker pull aiotceo/coredns:1.3.1
查看镜像:
为了让kubeadm程序能找到k8s.gcr.io
下面的镜像,需要把刚才下载的镜像名称重新打一下tag
docker images | grep aiotceo | sed 's/aiotceo/k8s.gcr.io/' | awk '{print "docker tag " $3 " " $1 ":" $2}' | sh
删除旧的镜像:
docker images | grep aiotceo | awk '{print "docker rmi " $1 ":" $2}' | sh
docker pull jmgao1983/flannel:v0.11.0-amd64
docker pull loveone/kubernetes-dashboard-amd64:v1.10.1
k8s 的完整镜像:
1. systemctl enable docker.service
2. docker info | grep Cgrou
3. vim /etc/docker/daemon.json
{
"exec-opts":["native.cgroupdriver=systemd"]
}
4. 关闭交换区
swapoff -a
vi /etc/fstab
#swap一行注释
5. 配置网桥,和图片错误没关系
cat < /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system
如果服务器重启,想恢复服务,要怎么操作呢?
方法一:启动节点k8s服务
systemctl start kubelet
方法二:设置开机启动
systemctl enable kubelet
#--kubernetes-version:指定版本
#--pod-network-cidr:设置pod内虚拟ip的边界。
kubeadm init --kubernetes-version=v1.15.6 --pod-network-cidr=10.24.0.0/16
如果出现以下错误:
请按照这个步骤进行配置:
1. systemctl enable docker.service
2. docker info | grep Cgrou
3. 一定要保证k8s的cgroup 与 docker的一致,否则可能会导致从节点k8s启动失败等问题
vim /etc/docker/daemon.json
{
"exec-opts":["native.cgroupdriver=systemd"]
}
4. 关闭交换区
swapoff -a
vi /etc/fstab
#swap一行注释
5. cpu不够2个,可以修改虚拟机cpu数量为2
6. 配置网桥,和图片错误没关系
cat < /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system
修改k8s的cgroup:failed to run Kubelet: failed to create kubelet: misconfiguration: kubelet cgroup driver: "systemd" - wangzy-Zj - 博客园 (cnblogs.com)
执行3.9.2中的init命令之后,会出现以下要求执行的命令,复制命令,直接执行即可。
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
#以下文件中是集群本身的信息以及安全授权的信息
/etc/kubernetes/admin.conf
#k8s默认读取的配置文件夹
$HOME/.kube/config
# 这条命令是需要在从节点服务器执行的,执行完后会把从节点加入到集群
kubeadm join 192.168.56.110:6443 --token aw4mln.kvuz5241deb17e6q \
--discovery-token-ca-cert-hash sha256:b8b1c666b3ab77f53acadd084dca7be2a94c4ad9f7ad06ec25ba48e5bd505cd2
kubeadm token list
pod和pod之间的通信协议组件。
#获取节点信息
kubectl get nodes
#查看所有名称空间下的pod容器,包含k8s自己内部的
kubectl get pod --all-namespaces
#pod和pod容器之间通信的协议组件的创建
kubectl create -f kube-flannel.yml
创建kube-flannel.yml文件,然后执行:kubectl create -f kube-flannel.yml,完成flannel组件安装。以下是:v0.15.1 版本的内容。
cat << EOF > kube-flannel.yml
---
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
name: psp.flannel.unprivileged
annotations:
seccomp.security.alpha.kubernetes.io/allowedProfileNames: docker/default
seccomp.security.alpha.kubernetes.io/defaultProfileName: docker/default
apparmor.security.beta.kubernetes.io/allowedProfileNames: runtime/default
apparmor.security.beta.kubernetes.io/defaultProfileName: runtime/default
spec:
privileged: false
volumes:
- configMap
- secret
- emptyDir
- hostPath
allowedHostPaths:
- pathPrefix: "/etc/cni/net.d"
- pathPrefix: "/etc/kube-flannel"
- pathPrefix: "/run/flannel"
readOnlyRootFilesystem: false
# Users and groups
runAsUser:
rule: RunAsAny
supplementalGroups:
rule: RunAsAny
fsGroup:
rule: RunAsAny
# Privilege Escalation
allowPrivilegeEscalation: false
defaultAllowPrivilegeEscalation: false
# Capabilities
allowedCapabilities: ['NET_ADMIN', 'NET_RAW']
defaultAddCapabilities: []
requiredDropCapabilities: []
# Host namespaces
hostPID: false
hostIPC: false
hostNetwork: true
hostPorts:
- min: 0
max: 65535
# SELinux
seLinux:
# SELinux is unused in CaaSP
rule: 'RunAsAny'
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: flannel
rules:
- apiGroups: ['extensions']
resources: ['podsecuritypolicies']
verbs: ['use']
resourceNames: ['psp.flannel.unprivileged']
- apiGroups:
- ""
resources:
- pods
verbs:
- get
- apiGroups:
- ""
resources:
- nodes
verbs:
- list
- watch
- apiGroups:
- ""
resources:
- nodes/status
verbs:
- patch
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: flannel
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: flannel
subjects:
- kind: ServiceAccount
name: flannel
namespace: kube-system
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: flannel
namespace: kube-system
---
kind: ConfigMap
apiVersion: v1
metadata:
name: kube-flannel-cfg
namespace: kube-system
labels:
tier: node
app: flannel
data:
cni-conf.json: |
{
"name": "cbr0",
"cniVersion": "0.3.1",
"plugins": [
{
"type": "flannel",
"delegate": {
"hairpinMode": true,
"isDefaultGateway": true
}
},
{
"type": "portmap",
"capabilities": {
"portMappings": true
}
}
]
}
net-conf.json: |
{
"Network": "10.244.0.0/16",
"Backend": {
"Type": "vxlan"
}
}
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: kube-flannel-ds
namespace: kube-system
labels:
tier: node
app: flannel
spec:
selector:
matchLabels:
app: flannel
template:
metadata:
labels:
tier: node
app: flannel
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/os
operator: In
values:
- linux
hostNetwork: true
priorityClassName: system-node-critical
tolerations:
- operator: Exists
effect: NoSchedule
serviceAccountName: flannel
initContainers:
- name: install-cni-plugin
image: rancher/mirrored-flannelcni-flannel-cni-plugin:v1.0.0
command:
- cp
args:
- -f
- /flannel
- /opt/cni/bin/flannel
volumeMounts:
- name: cni-plugin
mountPath: /opt/cni/bin
- name: install-cni
image: quay.io/coreos/flannel:v0.15.1
command:
- cp
args:
- -f
- /etc/kube-flannel/cni-conf.json
- /etc/cni/net.d/10-flannel.conflist
volumeMounts:
- name: cni
mountPath: /etc/cni/net.d
- name: flannel-cfg
mountPath: /etc/kube-flannel/
containers:
- name: kube-flannel
image: quay.io/coreos/flannel:v0.15.1
command:
- /opt/bin/flanneld
args:
- --ip-masq
- --kube-subnet-mgr
resources:
requests:
cpu: "100m"
memory: "50Mi"
limits:
cpu: "100m"
memory: "50Mi"
securityContext:
privileged: false
capabilities:
add: ["NET_ADMIN", "NET_RAW"]
env:
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
volumeMounts:
- name: run
mountPath: /run/flannel
- name: flannel-cfg
mountPath: /etc/kube-flannel/
volumes:
- name: run
hostPath:
path: /run/flannel
- name: cni-plugin
hostPath:
path: /opt/cni/bin
- name: cni
hostPath:
path: /etc/cni/net.d
- name: flannel-cfg
configMap:
name: kube-flannel-cfg
EOF
如果所有pod都是Running状态,那么就成功master节点就成功创建好了。
从节点上按照上面从3.1到3.7执行一遍
执行3.9.3中的:kubeadm join ..... 命令后,就加入集群中了。
docker pull loveone/kubernetes-dashboard-amd64:v1.10.1
预留。。。。。。。。。。。
#创建部署
kubectl create -f 部署yml文件
#更新部署配置
kubectl apply -f 部署yml文件
#查看已部署pod
kubectl get pod [-o wide]
#查看pod详细信息
kubectl describe pod pod名称
#查看pod日志输出
kubectl logs [-f] pod名称
1、创建一个目录存放部署yml文件
mkdir -p /local/k8s/tomcat-deploy
2、创建部署文件
vim tomcat-deploy.yml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: tomcat-deploy
spec:
replicas: 2
template:
metadata:
labels:
app: tomcat-cluster #要被tomcat-service选择绑定,绑定成功,就可转发请求到被绑定的服务
spec:
containers:
- name: tomcat-cluster
image: tomcat:latest #容器镜像
ports:
- containerPort: 8080 #pod内的端口
3、创建部署
kubectl create -f ./tomcat-deploy.yml
4、查看部署
kubectl get deployment
5、获取详细信息的pod
kubectl get pod -o wide
6、查看某一个pod的详细信息
kubectl describe pod tomcat-deploy-b76dd4475-hh9zf(pod名称)
7、查看pod内部的日志
kubectl logs tomcat-deploy-b76dd4475-hh9zf(pod名称)
目前要想访问tomcat还是不行的,需要创建一个service
8、创建tomcat-service包的路径
mkdir -p /local/k8s/tomcat-service
9、创建tomcat-service服务yml 文件,service服务能够负载请求到其他node节点。
vim tomcat-service.yml
apiVersion: v1
kind: Service
metadata:
name: tomcat-service
spec:
type: NodePort
selector:
app: tomcat-cluster #选择绑定的集群名,是tomcat部署文件中设置的模板标签名
ports:
- port: 8000 #service的pod中ip
targetPort: 8080 #node节点中pod内服务的端口
nodePort: 32500 #映射宿主机的端口,三个tomcat服务映射的宿主机端口
10、创建tomcat-service服务
kubectl create -f ./tomcat-service.yml
11、查看服务是否创建成功
kubectl get service
12、查看服务service的详细信息
kubectl describe service tomcat-service
13、进入容器
kubectl exec -it tomcat-deployment-795d745898-fvswl /bin/bash
以上tomcat就可以通过ip:32500 访问了,如果访问不通,参考:
(76条消息) k8s使用kubectl创建tomcat访问页面出现404页面_吃葡萄不吐西瓜皮~的博客-CSDN博客
由master节点服务器作为文件共享服务器。
yum install -y nfs-utils rpcbind
这个目录先会存放所有需要部署的共享文件。
mkdir -p /usr/local/data/www-data
vim /etc/exports
#以下为exports中内容。192.168.56.110/24为提供方服务器ip,rw为读写权限,sync为本地或远程有文件变更时及时同步变更的内容。
/usr/local/data/www-data 192.168.56.110/24(rw,sync)
#启动服务
systemctl start nfs.service
#设置为开机启动
systemctl enable nfs.service
#启动服务
systemctl start rpcbind.service
#设置为开机启动
systemctl enable rpcbind.service
exportfs
显示下面成功。
node节点上安装nfs-utils工具集就可以了。
yum install -y nfs-utils
showmount -e 192.168.56.110
可以查出 /usr/local/data/www-data对外共享文件:
/mnt下不是真正存在远程文件,而是映射的远程文件,连接到主服务器上读取。
mount 192.168.56.110:/usr/local/data/www-data /mnt
systemctl enable nfs.service
#1、查看部署
kubectl get deployment
#2、删除部署文件
kubectl delete deployment 部署文件名称
#3、查看pod
kubectl get pod
#4、查看service
kubectl get service
#5、删除service
kubectl delete service service名称
vim tomcat-deploy.yml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: tomcat-deploy
spec:
replicas: 2
template:
metadata:
labels:
app: tomcat-cluster #要被tomcat-service选择绑定,绑定成功,就可转发请求到被绑定的服务
spec:
volumes:
- name: web-app #别名
hostPath:
path: /mnt #从节点容器挂载点,宿主机原始目录
containers:
- name: tomcat-cluster
image: tomcat:latest #容器镜像
ports:
- containerPort: 8080 #pod内的端口
volumeMounts:
- name: web-app
mountPath: /usr/local/tomcat/webapps #用/mnt目录下的内容替代调pod中的这个目录下的内容
kubectl create -f tomcat-deploy.yml
#进入pod容器内部
kubectl exec -it pod名称 /bin/bash
我们不在使用node节点对外暴漏32500端口来接受外部请求,所有请求都得需要master节点接收。
apiVersion: v1
kind: Service
metadata:
name: tomcat-service
spec:
# type: NodePort
selector:
app: tomcat-cluster
ports:
- port: 8000
targetPort: 8080
# nodePort: 32500
kubectl create -f tomcat-service.yml
kubectl get service
kubectl describe service tomcat-service
cd /usr/local/data/www-data/test
vim index.jsp
<%=request.getLocalAddr()%>
访问master节点k8s的虚拟:ip+端口
可以看出被随机转发给下游节点了。
cd /usr/local
wget http://www.boutell.com/rinetd/http/rinetd.tar.gz
tar -zxvf rinetd.tar.gz 或者 unzip rinetd.tar.gz
cd /rinetd
sed -i 's/65536/65535/g' rinetd.c
mkdir -p /usr/man
yum install -y gcc
make && make install
vim /etc/rinetd.conf
#以下为rinetd.conf的内容,宿主机的ip port 映射 k8s的 ip port
0.0.0.0 8000 10.109.146.76 8000
#重新加载配置
rinetd -c /etc/rinetd.conf
#查看服务其上ip和暴漏的端口号
netstat -tulpn
下面内容可以更新到部署文件的yml中,做资源限定。更新内容后,可执行:
kubectl apply -f xxx.yml
containers:
-name: tomcat-cluster
image: tomcat:latest
resources:
requests: #最少的需求
cpu: 1 #至少有一个cpu空闲
memory: 500Mi #至少内存有500mb空闲 才能创建容器pod
limits: #上限
cpu: 2 #上限2个cpu
memory: 1024Mi #内存上限1024mb