谷粒商城-服务4(K8s部署篇)

一、K8s(KubeSphere)

中文官网:https://kubernetes.io/zh/
k8s 是分布式部署管理工具,用于容器的部署和编排
Kubernetes 简称 k8s。是用于自动部署,扩展和管理容器化应用程序的开源系统。
中文官网:https://kubernetes.io/zh/
中文社区:https://www.kubernetes.org.cn/
官方文档:https://kubernetes.io/zh/docs/home/
社区文档:http://docs.kubernetes.org.cn/

二、架构与概念

2.1 架构

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.2 概念

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三、k8s 集群安装

3.1 kubeadm

kubeadm 是官方社区推出的一个用于快速部署 kubernetes 集群的工具。
这个工具能通过两条指令完成一个 kubernetes 集群的部署:
# 创建一个 Master 节点
$ kubeadm init
# 将一个 Node 节点加入到当前集群中
$ kubeadm join <Master 节点的 IP 和端口 >

3.2 前置要求

一台或多台机器,操作系统 CentOS7.x-86_x64
硬件配置:2GB 或更多 RAM,2 个 CPU 或更多 CPU,硬盘 30GB 或更多
集群中所有机器之间网络互通
可以访问外网,需要拉取镜像
禁止linux的 swap 分区

3.3 部署步骤

1.在所有节点上安装 Docker 和 kubeadm
2.部署 Kubernetes Master
3.部署容器网络插件
4.部署 Kubernetes Node,将节点加入 Kubernetes 集群中
5.部署 Dashboard Web 页面,可视化查看 Kubernetes 资源

在这里插入图片描述

3.4 环境准备

3.4.1 准备工作

在这里插入图片描述
在这里插入图片描述

3.4.2 启动三个虚拟机

● 使用我们提供的 vagrant 文件,复制到非中文无空格目录下,运行
vagrant up
启动三个虚拟机。其实 vagrant 完全可以一键部署全部 k8s 集群。
https://github.com/rootsongjc/kubernetes-vagrant-centos-cluster
http://github.com/davidkbainbridge/k8s-playground
● 默认创建的虚拟器只能用ssh访问,为了让客户端(如xshell访问)我们需要进行以下设置,进入三个虚拟机,开启 root 的密码访问权限。

##进去系统之后
Vagrant ssh XXX  `vagrant ssh k8s-node1`
su root 密码为 vagrant
vi /etc/ssh/sshd_config
修改 PasswordAuthentication yes/no
##重启服务 
service sshd restart
所有虚拟机设置为 4 核 4G

设置好 NAT 网络

把k8s文件夹复制到一个没有中文和空格的文件夹路径下。
在这里插入图片描述
在k8s 文件夹下运行 vagrant up 代码
在这里插入图片描述
Vagrant ssh XXX
su root 密码为 vagrant
vi /etc/ssh/sshd_config 修改 PasswordAuthentication no 为 PasswordAuthentication yes
重启服务 service sshd restart
在这里插入图片描述
在这里插入图片描述
这样就可以通过xshell去连接我们的虚拟机了。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
设置网络,由于当前虚拟机使用的网卡是eth0
在这里插入图片描述
所以需要设置每个虚拟机的网卡
在这里插入图片描述
为每一个虚拟机船舰net网络

在这里插入图片描述
设置完成后
ping 以下买个机器都能联通其他的两个机器并且都能ping 通baidu.com(外网)
在这里插入图片描述

3.4.3 设置 linux 环境(三个节点都执行)

## 关闭防火墙:
systemctl stop firewalld
systemctl disable firewalld
=================================
## 关闭 selinux 安全策略:
sed -i 's/enforcing/disabled/' /etc/selinux/config
## 查看selinux 安全策略
cat /etc/selinux/config    可以看到:SELINUX=disabled
## 禁掉当前会话
#setenforce 0
=================================
##关闭 swap 内存交换:
#临时关闭
#swapoff -a 
#永久关闭
sed -ri 's/.*swap.*/#&/' /etc/fstab    
cat /etc/fstab   可以看到:#/swapfile none swap defaults 0 0
free -g 验证,swap 必须为 0;
=================================
## 添加主机名与 IP 对应关系
vi /etc/hosts
10.0.2.10 k8s-node1
10.0.2.9 k8s-node2
10.0.2.15 k8s-node3
hostnamectl set-hostname <newhostname>:指定新的 hostname(可以不做)
=================================
## 将桥接的 IPv4 流量传递到 iptables 的链:
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system
=================================
##疑难问题:
##遇见提示是只读的文件系统,运行如下命令
mount -o remount rw /
date 查看时间 (可选)
yum install -y ntpdate
ntpdate time.windows.com 同步最新时间

为每个会话发送西悉尼
在这里插入图片描述
这样在任意会话中发送消息,所有会话都会执行。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

关闭防火墙
在这里插入图片描述
关闭 selinux
在这里插入图片描述
关闭 swap 内存交换
在这里插入图片描述
添加主机名称与ip对应关系
在这里插入图片描述
找到ip每个node的ip并完成下面的对应关系,我本机的如下:
10.0.2.5 k8s-node1
10.0.2.4 k8s-node2
10.0.2.6 k8s-node3
在这里插入图片描述
修改host文件:vi /etc/hosts
在这里插入图片描述
将桥接的 IPv4 流量传递到 iptables 的链
在这里插入图片描述
养成好习惯,为每个虚拟机生成一个备份
在这里插入图片描述
在这里插入图片描述

3.5 所有节点安装 Docker、kubeadm、kubelet、kubectl

Kubernetes 默认 CRI(容器运行时)为 Docker,因此先安装 Docker。
kubeadm 用户建立k8s master 和 node 建立完成后就没用了

3.5.1 安装 docker

## 1 卸载系统之前的 docker 下面是一整句
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine

## 2 安装 Docker-CE
## 安装必须的依赖
sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2

## 3 设置 docker repo 的 yum 位置,这个仓库已经被禁用了 代码返回:fastestmirror。
## sudo yum-config-manager \ --add-repo \https://download.docker.com/linux/centos/docker-ce.repo
## 可以使用alibab的仓库来替换	
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

## 4 安装 docker,以及 docker-cli
sudo yum install -y docker-ce docker-ce-cli containerd.io

## 5 配置 docker 加速 (选做) 这步不要做,会有问题。
## 如果做了导致docker 无法启动记得删除/etc/docker 这个文件加然后重新安装。
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF' {
      
       "registry-mirrors": ["https://82m9ar63.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

## 6 启动 docker & 设置 docker 开机自启,一定要做这一步
systemctl enable docker

基础环境准备好,可以给三个虚拟机备份一下;为 node3 分配 16g,剩下的 3g。方便未来 侧测试

第四步:安装docker完成后,重启docker 报错sudo systemctl restart docker
Job for docker.service failed because the control process exited with error code. See “systemctl status docker.service” and “journalctl -xe” for details.
在这里插入图片描述
问题可能2个
第一种:执行了第5步,第5步有我问题不能执行。
如果执行就需要删除/etc/docker 文件
rm -rf docker/
第二种:可能是虚拟机的内核版本太低造成的可以升级虚拟机内核,因为docker默认安装的是最新的版本,可能与虚拟机的版本不对应。

## 查看安装过的包
yum list installed | grep docker
## 删除安装的Docker相关的软件包
yum remove docker-*
## 查看内核版本【Docker要求Centos系统的内核版本高于3.10】
uname -r
## 把yum包更新到最新(时间可能有点长,慢慢等待......
yum update
## 查看仓库的docker版本
yum list docker-ce --showduplicates | sort -r
## 启动docker,设置开机启动docker。
systemctl start docker
systemctl enable docker

3.5.2 添加阿里云 yum 源

阿里云镜像地址:https://developer.aliyun.com/mirro
在这里插入图片描述

3.5.3 安装 kubeadm,kubelet 和 kubectl

添加仓库

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

安装kubelet kubeadm kubectl

yum list|grep kubeyum
## 安装安装 kubeadm,kubelet 和 kubectl ps:一定要加上--nogpgcheck
yum install -y --nogpgcheck kubelet-1.17.3 kubeadm-1.17.3 kubectl-1.17.3
## 一定要设置开机启动
systemctl enable kubelet 
systemctl start kubelet
#如果安装过程有问题可以查找&删除包
#yum list installed | grep kub*
#yum remove kub*
#命令查询一下kubeadm所需的k8s镜像包版本doc,本案例中查询出来的版本不一致,不知道会不会有影响
#kubeadm config images list 

四、k8s 部署

4.1 master 节点初始化

## 在虚拟机的root下上传k8s文件夹
## 修改master_images.sh 的读写权限
chmod 700 master_images.sh 
## 查看文件权限 -rwx------ 1 root root   396 Jul 29 00:53 master_images.sh
ll 
## 执行批处理下载镜像
./master_images.sh 
## 获取当前ip设置下面的初始化语句
ip route show
ip addr
## 初始化kubeadm 
kubeadm init  --apiserver-advertise-address=10.0.2.10  --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers  --kubernetes-version v1.17.3  --service-cidr=10.96.0.0/16  --pod-network-cidr=10.244.0.0/16

由于默认拉取镜像地址 k8s.gcr.io 国内无法访问,这里指定阿里云镜像仓库地址。可以手动
按照我们的 images.sh 先拉取镜像,
地址变为 registry.aliyuncs.com/google_containers 也可以。
科普:无类别域间路由(Classless Inter-Domain Routing、CIDR)是一个用于给用户分配 IP
地址以及在互联网上有效地路由 IP 数据包的对 IP 地址进行归类的方法。
拉取可能失败,需要下载镜像。
运行完成提前复制:加入集群的令牌

在虚拟机的root下上传k8s文件夹
在这里插入图片描述
在linux下进入k8s 目录修改master_images.sh 文件的访问权限

chmod 700 master_images.sh 

master_images.sh 文件内容

#!/bin/bash

images=(
	kube-apiserver:v1.17.3
    kube-proxy:v1.17.3
	kube-controller-manager:v1.17.3
	kube-scheduler:v1.17.3
	coredns:1.6.5
	etcd:3.4.3-0
    pause:3.1
)

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
done

在这里插入图片描述
执行master_images.sh 下载镜像。

./master_images.sh 

在这里插入图片描述
在这里插入图片描述
找到当前网卡的地址为:10.0.2.10
在这里插入图片描述
初始化kubeadm

kubeadm init \ 
--apiserver-advertise-address=10.0.2.10 \ 
--image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \ 
--kubernetes-version v1.17.3 \ 
--service-cidr=10.96.0.0/16 \ 
--pod-network-cidr=10.244.0.0/16

在这里插入图片描述
kubeadm初始化完成
在这里插入图片描述
在这里插入图片描述

最后的这段代码非常重要:control-plane 初始化成功后,下面提示时如何操作kubeadm的步骤

Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 10.0.2.10:6443 --token 7jcznm.jpghgif9ayor1al1 \
    --discovery-token-ca-cert-hash sha256:054d3b42012f03e1c8d59f07adc3fa14efb729f4a6caaa9fc734a9f70c00c53b 

4.2 测试kubectl(添加子节点)

###第一步##################################################
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
## 获取获取节点 目前 master 状态为 notready。等待网络加入完成即可
kubectl get nodes
## 查看 kubelet 日志
journalctl -u kubelet
###第二步##################################################
## 网络安装
kubectl apply -f \ https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
## 本地安装 在k8s 文件加下如果网络安装不上就用下面的
chmod 700 kube-flannel.yml
kubectl apply -f kube-flannel.yml
## 如果安装有问题需要删除
## kubectl delete -f kube-flannel.yml
## 获取所有的名称空间
kubectl get ns
## 获取到所有的pods以及名称空间
kubectl get pods --all-namespaces
## 把这个节点加入到kubeadm 中 这段代码是上面初始化kubeadm 后生成的
## 054d3b42012f03e1c8d59f07adc3fa14efb729f4a6caaa9fc734a9f70c00c53b 这是token是临时生成的有效时间2小时。
###第三步##################################################
kubeadm join 10.0.2.10:6443 --token 7jcznm.jpghgif9ayor1al1 \
    --discovery-token-ca-cert-hash sha256:054d3b42012f03e1c8d59f07adc3fa14efb729f4a6caaa9fc734a9f70c00c53b
## 第四步:如果上面的token过期
kubeadm token create --print-join-command
kubeadm token create --ttl 0 --print-join-command
kubeadm join 10.0.2.10:6443 --token 7jcznm.jpghgif9ayor1al1 \
    --discovery-token-ca-cert-hash sha256:054d3b42012f03e1c8d59f07adc3fa14efb729f4a6caaa9fc734a9f70c00c53b
##  监控 pod 状态
watch kubectl get pod -n kube-system -o wide

4.2.1 第一步:配置master节点

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

4.2.2 第二步:安装 Pod 网络插件(CNI)master节点

用于pod之间的相互通信地址

## 网络安装
kubectl apply -f \ https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
## 本地安装 在k8s 文件加下如果网络安装不上就用下面的
chmod 700 kube-flannel.yml
kubectl apply -f kube-flannel.yml
## 如果安装有问题需要删除
## kubectl delete -f kube-flannel.yml
## 获取所有的名称空间
kubectl get ns
## 获取到所有的pods
kubectl get pods --all-namespaces

获取获取节点
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.2.3 第三步:加入节点 node节点执行

在子节点中运行

kubeadm join 10.0.2.10:6443 --token 7jcznm.jpghgif9ayor1al1 \
    --discovery-token-ca-cert-hash sha256:054d3b42012f03e1c8d59f07adc3fa14efb729f4a6caaa9fc734a9f70c00c53b

在这里插入图片描述
在这里插入图片描述
监控 pod 状态

5、入门操作 kubernetes 集群

官网api:https://kubernetes.io/zh/docs/reference/#cli
在这里插入图片描述

## 当前api支持的资源
kubectl api-resources
## 获取所有已安装的资源
Kubectl get all
##测试开始
## 1.部署一个tomcat
kubectl create deployment tomcat6 --image=tomcat:6.0.53-jre8
## 获取所有的pods详细信息
kubectl get pods -o wide
## 获取所有的pods名称空间信息
kubectl get pods --all-namespaces
## 2.暴露 tomcat6 对外访问
## Pod 的 80 映射容器的 8080;service 会代理 Pod 的 80 由于这么没有指定service的端口,所以会随机生成一个端口
## --type=NodePort 会生成一个对外的service 暴露给外部访问,一个service可以包含多个pod ,一个pod中可以有多个容器
kubectl expose deployment tomcat6 --port=80 --target-port=8080 --type=NodePort
## 查看生成的service
kubectl get service
## 3.动态扩容测试,扩容了多份,所有无论访问哪个 node 的指定端口,都可以访问到 tomcat6
### 查看需要扩容的deployment
kubectl get deployment
### 扩容
kubectl scale --replicas=3 deployment tomcat6
### 查看扩容后的结果
kubectl get pods -o wide
## 部署三份
kubectl scale --replicas=3 deployment tomcat6
## 4.以上操作的 yaml 获取
## 5、删除
Kubectl get all 
kubectl delete deploy/nginx 
kubectl delete service/nginx-service

流程:创建 deployment 会管理 replicas,replicas 控制 pod 数量,有 pod 故障会自动拉起 新的 pod
外部访问tomcat6,任意一个节点都可以访问
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
扩容3份
在这里插入图片描述
在这里插入图片描述
上面的访问依然没有问题
在这里插入图片描述
删除部署
在这里插入图片描述

6、kubernetes 的 yaml 语法

## 生成一个tomcat6 模板 
### --dry-run 表示测试不会真的执行。
kubectl create deployment tomcat6 --image=tomcat:6.0.53-jre8 --dry-run -o yaml > tomcat6.yaml
## 修改tomcat6.yaml 保存部署的最简信息
vi tomcat6.yaml

部署的最简信息 yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: tomcat6
  name: tomcat6
spec:
  replicas: 3
  selector:
    matchLabels:
      app: tomcat6
  template:
    metadata:
      labels:
        app: tomcat6
    spec:
      containers:
      - image: tomcat:6.0.53-jre8
        name: tomcat

通过yaml部署

## 通过yaml部署
kubectl apply -f tomcat6.yaml 
kubectl apply -f tomcat6.yaml 

在这里插入图片描述
暴露服务,与上面的操作一样。

## 暴露服务
kubectl expose deployment tomcat6 --port=80 --target-port=8080 --type=NodePort --dry-run -o yaml

五、k8s 细节

5.1 kubectl

1、kubectl 文档:https://kubernetes.io/zh/docs/reference/kubectl/overview/

2、资源类型
https://kubernetes.io/zh/docs/reference/kubectl/overview/#%E8%B5%84%E6%BA%90%E7%B1%B B%E5%9E%8B

3、格式化输出
https://kubernetes.io/zh/docs/reference/kubectl/overview/#%E6%A0%BC%E5%BC%8F%E5%8C%9 6%E8%BE%93%E5%87%BA

4、常用操作
https://kubernetes.io/zh/docs/reference/kubectl/overview/#%E7%A4%BA%E4%BE%8B-%E5%B8% B8%E7%94%A8%E6%93%8D%E4%BD%9C

5、命令参考
https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands

5.2 yaml 字段解析

参照官方文档

5.3 入门操作

5.3.1、Pod 是什么,Controller 是什么

https://kubernetes.io/zh/docs/concepts/workloads/pods/#pods-and-controllers
Pod 和控制器 控制器可以为您创建和管理多个 Pod,管理副本和上线,并在集群范围内提供自修复能力。 例如,如果一个节点失败,控制器可以在不同的节点上调度一样的替身来自动替换 Pod。 包含一个或多个 Pod 的控制器一些示例包括: Deployment StatefulSet DaemonSet 控制器通常使用您提供的 Pod 模板来创建它所负责的 Pod
在这里插入图片描述

5.3.2、Deployment&Service 是什么

Deployment 可以通过部署来部署一个pod,pod想要通过外部访问,需要通过service暴露端口。
在这里插入图片描述

5.3.3、Service 的意义

1、部署一个 nginx
kubectl create deployment nginx --image=nginx 
2、暴露 nginx 访问 kubectl expose deployment nginx --port=80 --type=NodePort
 统一应用访问入口; Service 管理一组 Pod。 防止 Pod 失联(服务发现)、定义一组 Pod 的访问策略 现在 Service 我们使用 NodePort 的方式暴露,这样访问每个节点的端口,都可以访问到这 个 Pod,如果节点宕机,就会出现问题。

5.3.4、labels and selectors

可以为每个pod 添加label 抱歉,类似于css中class 这样就可以通过selectors(选择器)来统一操作相同标签的资源。
在这里插入图片描述

5.3.5、★Ingress 底层是nginx

相当于为我们每一个节点部署了一个nginx,然后通过nginx负载均衡到pod。
通过 Service 发现 Pod 进行关联。基于域名访问。 通过 Ingress Controller 实现 Pod 负载均衡 支持 TCP/UDP 4 层负载均衡和 HTTP 7 层负载均衡
步骤: 1)、部署 Ingress Controller 2)、创建 Ingress 规则
在这里插入图片描述
Ingress 实现通过域名访问负载到不同的机器。
第一步:为每个节点部署部署 Ingress Controller

## 通过yaml为每个节点创建Ingress 
kubectl apply -f ingress-controller.yaml
## 查看安装情况
kubectl get pods --all-namespaces

安装pod和暴露service的yaml

 kubectl apply -f ingress.yaml 

ingress.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: tomcat6
  name: tomcat6
spec:
  replicas: 3
  selector:
    matchLabels:
      app: tomcat6
  template:
    metadata:
      labels:
        app: tomcat6
    spec:
      containers:
      - image: tomcat:6.0.53-jre8
        name: tomcat
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: tomcat6
  name: tomcat6
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 8080
  selector:
    app: tomcat6
  type: NodePort

查看ingress-controller.yaml 配置
在这里插入图片描述
查看安装情况
在这里插入图片描述

第二步:创建 Ingress 规则
webdd

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: web
spec:
  rules:
  - host: tomcat6.kubenetes.com
    http:
       paths:
          - backend:
              serviceName: tomcat6
              servicePort: 80

修改host文件

192.168.56.102   tomcat6.kubenetes.com

测试:http://tomcat6.kubenetes.com/
在这里插入图片描述

5.3.6、网络模型

Kubernetes 的网络模型从内至外 由四个部分组成:

1、Pod 内部容器所在的网络 
2、Pod 所在的网络 
3、Pod 和 Service 之间通信的网 络
4、外界与 Service 之间通信的网

猜你喜欢

转载自blog.csdn.net/fen_dou_shao_nian/article/details/119063900