JavaEE 企业级分布式高级架构师(十八)容器虚拟化技术(3)

K8S集群服务搭建

环境准备

机器环境

  • 节点CPU核数必须是 大于等于 2核,否则k8s无法启动。
  • 内存环境准备:不小于 2GB。
  • DNS网络:最好设置为本地网络连通的DNS,否则网络不通,无法下载一些镜像。
  • linux内核:linux内核建议是 4 版本以上,因此需要把linux核心进行升级。4 版本以下也能安装,但是正式线上环境可能会出现问题。
  • 查看CPUx相关信息的命令如下:
# 查看CPU信息(型号)
[root@centos112 ~]# cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c
      2  Intel(R) Core(TM) i7-8850H CPU @ 2.60GHz
# 查看物理CPU个数
[root@centos108 ~]# cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l
2
# 查看每个物理CPU中core的个数(即核数)
[root@centos108 ~]# cat /proc/cpuinfo| grep "cpu cores"| uniq
cpu cores	: 1
# 查看逻辑CPU的个数
[root@centos108 ~]# cat /proc/cpuinfo| grep "processor"| wc -l
2
  • 准备三台虚拟机环境,或者是三台阿里云服务器,这里演示在VMware虚拟机中进行安装。
192.168.254.108: k8s-master01 此机器用来安装k8s master节点的环境
192.168.254.110: k8s-node01 此机器用来安装k8s node节点的环境
192.168.254.112: k8s-node02 此机器用来安装k8s node节点的环境

依赖环境

  • 配置 IP host 映射关系:
# vim /etc/hosts
192.168.254.108 k8s-master01
192.168.254.110 k8s-node01
192.168.254.112 k8s-node02
  • 安装依赖环境:
yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wget vim net-tools git iproute lrzsz bash-completion tree bridge- utils unzip bind-utils gcc
  • 安装iptables,启动iptables,设置开机自启,清空iptables规则,保存当前规则到默认规则:
# 关闭防火墙
systemctl stop firewalld && systemctl disable firewalld
# 置空iptables
yum -y install iptables-services && systemctl start iptables && systemctl enable iptables && iptables -F && service iptables save
  • 关闭selinux:
# 闭swap分区【虚拟内存】并且永久关闭虚拟内存
swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
# 关闭selinux
setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
  • 升级Linux内核版本:
# 下载升级包
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-4.el7.elrepo.noarch.rpm
# 安装内核
yum --enablerepo=elrepo-kernel install -y kernel-lt
# 设置开机从新内核启动
grub2-set-default 'CentOS Linux (4.4.189-1.el7.elrepo.x86_64) 7 (Core)'
# 注意:设置完内核后,需要重启服务器才会生效。
# 查询内核
uname -r
  • 调整内核参数,主要正对于k8s:
cat > kubernetes.conf <<EOF
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
vm.swappiness=0
vm.overcommit_memory=1
vm.panic_on_oom=0
fs.inotify.max_user_instances=8192
fs.inotify.max_user_watches=1048576
fs.file-max=52706963
fs.nr_open=52706963
net.ipv6.conf.all.disable_ipv6=1
net.netfilter.nf_conntrack_max=2310720
EOF
# 将优化内核文件拷贝到/etc/sysctl.d/文件夹下,这样优化文件开机的时候能够被调用
cp kubernetes.conf /etc/sysctl.d/kubernetes.conf
# 手动刷新,让优化文件立即生效
sysctl -p /etc/sysctl.d/kubernetes.conf
  • 调整系统临时区:如果已经设置时区,可略过
#设置系统时区为中国/上海
timedatectl set-timezone Asia/Shanghai 
# 将当前的 UTC 时间写入硬件时钟
timedatectl set-local-rtc 0 
# 重启依赖于系统时间的服务 
systemctl restart rsyslog 
systemctl restart crond
  • 关闭系统不需要的服务:
systemctl stop postfix && systemctl disable postfix
  • 设置日志保存方式:
# 创建保存日志的目录
mkdir /var/log/journal
# 创建配置文件存放目录
mkdir /etc/systemd/journald.conf.d
# 创建配置文件
cat > /etc/systemd/journald.conf.d/99-prophet.conf <<EOF
[Journal]
Storage=persistent
Compress=yes
SyncIntervalSec=5m
RateLimitInterval=30s
RateLimitBurst=1000
SystemMaxUse=10G
SystemMaxFileSize=200M
MaxRetentionSec=2week
ForwardToSyslog=no
EOF
# 重启systemd journald的配置
systemctl restart systemd-journald
  • 打开文件数调整 (可忽略,不执行):
echo "* soft nofile 65536" >> /etc/security/limits.conf
echo "* hard nofile 65536" >> /etc/security/limits.conf
  • kube-proxy 开启 ipvs 前置条件:
modprobe br_netfilter
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
EOF
# 使用lsmod命令查看这些文件是否被引导
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack

docker部署

  • 安装docker
yum install -y yum-utils device-mapper-persistent-data lvm2
# 紧接着配置一个稳定(stable)的仓库、仓库配置会保存到/etc/yum.repos.d/docker-ce.repo文件中
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 更新Yum安装的相关Docke软件包&安装Docker CE
yum update -y && yum install docker-ce
# 安装好后查看版本
docker --version  或  docker -v
  • 设置docker daemon文件:
# 创建/etc/docker目录
mkdir /etc/docker
# 更新daemon.json文件
cat > /etc/docker/daemon.json <<EOF
{"exec-opts": ["native.cgroupdriver=systemd"],"log-driver": "json-file","log-opts": {"max-size": "100m"}}
EOF
# 注意: 一定注意编码问题,出现错误:查看命令:journalctl -amu docker 即可发现错误
# 创建,存储docker配置文件
mkdir -p /etc/systemd/system/docker.service.d
  • 重启docker服务:
systemctl daemon-reload && systemctl restart docker && systemctl enable docker
  • 检测是否按照成功:
[root@centos108 ~]# docker images
REPOSITORY   TAG       IMAGE ID   CREATED   SIZE

kubeadm(一键安装k8s)

  • 安装kubernetes的时候,需要安装kubelet, kubeadm等包,但k8s官网给的yum源是 packages.cloud.google.com,国内访问不了,此时我们可以使用阿里云的yum仓库镜像。
cat > /etc/yum.repos.d/kubernetes.repo <<EOF
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
       http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
  • 安装kubeadm、kubelet、kubectl:
yum install -y kubeadm-1.15.1 kubelet-1.15.1 kubectl-1.15.1
# 启动 kubelet
systemctl enable kubelet && systemctl start kubelet
  • 查看版本:
kubectl version

在这里插入图片描述

集群安装

依赖镜像

  • 查看需要安装的镜像包:
# kubeadm config images list
k8s.gcr.io/kube-apiserver:v1.15.1
k8s.gcr.io/kube-controller-manager:v1.15.1
k8s.gcr.io/kube-scheduler:v1.15.1
k8s.gcr.io/kube-proxy:v1.15.1
k8s.gcr.io/pause:3.1
k8s.gcr.io/etcd:3.3.10
k8s.gcr.io/coredns:1.3.1
  • 提前在本地下载以上镜像,压缩打包发到虚拟机中,并解压到本地镜像仓库

在这里插入图片描述

  • 编写脚本文件,导入镜像包到本地 docker 镜像仓库:kubeadm 初始化k8s集群的时候,会从gce Google云中下载(pull)相应的镜像,且镜像相对比较大,下载比较慢,且需要解决科学上网的一个问题,国内上goole,懂得…
  • 导入镜像脚本代码 (在任意目录下创建sh脚本文件:image-load.sh)
#!/bin/bash
# 注意: 镜像解压的目录位置
ls /usr/apps/kubeadm-basic.images > /tmp/images-list.txt
cd /usr/apps/kubeadm-basic.images
for i in $(cat /tmp/images-list.txt)
do
    docker load -i $i
done
rm -rf /tmp/images-list.txt
  • 修改权限,可执行权限,并开始执行镜像导入
chmod 755 image-load.sh
```bash
./image-load.sh
  • 传输文件到其他node节点:
# 拷贝到node01节点
scp -r image-load.sh root@k8s-node01:/usr/apps/kubeadm-basic.images/
# 贝到node02节点
scp -r image-load.sh root@k8s-node02:/usr/apps/kubeadm-basic.images/
# 其他节点依次执行sh脚本,导入镜像
  • 导入成功后镜像仓库如下图:

在这里插入图片描述

k8s部署

  • 注意:初始化主节点,只需要在主节点执行
  • 拉取 yaml 资源配置文件
kubeadm config print init-defaults > kubeadm-config.yaml
  • 修改yaml资源文件:

在这里插入图片描述

  • 初始化主节点,开始部署:
kubeadm init --config=kubeadm-config.yaml --experimental-upload-certs | tee kubeadm-init.log
  • 注意:执行此命令,CPU核心数量必须大于1核,否则无法执行成功。
  • kubernetes主节点初始化成功后,如下所示:

在这里插入图片描述

  • 按照k8s指示,执行下面的命令:初始化成功后执行如下命令
# 创建目录,保存连接配置缓存,认证文件
mkdir -p $HOME/.kube
# 拷贝集群管理配置文件
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
# 授权给配置文件
sudo chown $(id -u):$(id -g) $HOME/.kube/config
  • 执行命令后查询node:
[root@centos108 kubeadm-basic.images]# kubectl get node
NAME        STATUS     ROLES    AGE     VERSION
centos108   NotReady   master   5m40s   v1.15.1
  • 我们发现已经可以成功查询node节点信息了,但是节点的状态却是NotReady,不是Runing的状态。原因是此时我们使用ipvs+flannel的方式进行网络通信,但是flannel网络插件还没有部署,因此节点状态此时为NotReady。

flannel插件

  • 网络拓扑图:

在这里插入图片描述

  • 注意:部署flannel网络插件,只需要在主节点执行。
  • 下载flannel网络插件:
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
  • 部署flannel:
kubectl create -f kube-flannel.yml
# 也可进行部署网络
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
  • 部署完毕查询pod,现一些异常错误现象:
kubectl get pod -n kube-system

在这里插入图片描述

  • 发现通过flannel部署的pod都出现pending,ImagePullBackOff这样的问题,查询日志信息,发现了一些错误:
# 查询一个pod的详细信息
kubectl describe pod kube-flannel-ds-amd64-rd2wt -n kube-system

在这里插入图片描述

docker load < flanneld-v0.12.0-amd64.docker

在这里插入图片描述

  • 再次查看 node,发现节点状态已经是 Ready,说明网络组件 flannel 已经部署成功:
[root@centos108 flannel]# kubectl get node
NAME        STATUS   ROLES    AGE   VERSION
centos108   Ready    master   32h   v1.15.1

节点Join

  • 构建kubernetes主节点成功,会产生一个日志文件(命令中指定日志输出文件 “kubeadm-init.log”),内容如下所示:
tail -50 /usr/apps/kubeadm-basic.images/kubeadm-init.log

在这里插入图片描述

  • 加入主节点以及其余工作节点,执行安装日志中的命令即可:
# 复制命令到其他几个node节点进行执行即可
kubeadm join 192.168.254.108:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:2d71bf5f36489d839b1588ded2f2fa1ef71262a7b45318dc32e16c56935dd931
  • 可能会出现如下问题:token 过期

在这里插入图片描述

  • 于是可以使用如下命令在 master 节点执行,重新创建token:
[root@centos108 flannel]# kubeadm token create
2jxq79.edxxq13zrmf299zd
  • 检查token是否已过期,可以使用如下命令:
kubeadm token list

在这里插入图片描述

  • 重新复制如下命令到其他几个node节点再次进行执行即可
kubeadm join 192.168.254.108:6443 --token 2jxq79.edxxq13zrmf299zd \
--discovery-token-ca-cert-hash sha256:2d71bf5f36489d839b1588ded2f2fa1ef71262a7b45318dc32e16c56935dd931

在这里插入图片描述

  • 执行完毕,在 master 节点查看效果如下所示:发现还有一些节点处于NotReady状态,是因为这些节点pod容器还处于初始化的状态,需要等一点时间

在这里插入图片描述

  • 更详细查看命令,可以看见初始化节点所属节点:
# 查询工作空间中pod容器的详细信息
kubectl get pod -n kube-system -o wide

在这里插入图片描述

节点运行 kubectl 出错

The connection to the server localhost:8080 was refused - did you specify the right host or port?

在这里插入图片描述

  • 出现这个问题的原因是kubectl命令需要使用kubernetes-admin来运行
  • 解决办法:将主节点(master节点)中的【/etc/kubernetes/admin.conf】文件拷贝到从节点相同目录下

在这里插入图片描述

  • 配置环境变量:
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
# 立即生效
source ~/.bash_profile

私有仓库

  • 搭建私有仓库 harbor:harbor私有仓库和 Registry 私有仓库相比较而言,功能强大很多,并且支持 web 图形化管理,推荐使用。

环境准备

  • Python应该是 2.7 或更高版本
  • Docker引擎应为1.10或更高版本:Docker环境的安装前面已有,这里不再赘述
  • Docker Compose需要为1.6.0或更高版本

安装Compose

在这里插入图片描述

  • 在线下载 docker-compose,harbor 需要借助 docker-compose 安装
# 安装依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2
curl -L https://github.com/docker/compose/releases/download/1.27.4/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
  • 授权:
chmod u+x /usr/local/bin/docker-compose
# 查看其版本信息
docker-compose -version

安装harbor

在这里插入图片描述

准备工作
  • 追加 ip:hostname 到每一台机器节点
echo "192.168.254.116 hub.veli.com" >> /etc/hosts
安装配置
  • 解压缩安装包:
tar -zxvf arbor-offline-installer-<version>.tgz -C /Volumes/D/tools/
  • 配置 harbor.cfg:
hostname:目标的主机名或者完全限定域名
ui_url_protocol:http 或 https。 默认为 http
db_password:用于 db_auth的 MySQL数据库的根密码。更改此密码进行任何生产用途
max_job_workers:(默认值为3)作业服务中的复制工作人员的最大数量。对于每个映像复制作业,工作人员将存储库的所有标签同步到远程目标。增加此数字允许系统中更多的并发复制作业。但是,由于每个工作人员都会消耗一定数量的网络/ CPU / IO资源,请根据主机的硬件资源,仔细选择该属性的值
customize_crt:( on或 off。默认为 on)当此属性打开时, prepare脚本将为注册表的令牌的生成 /验证创建私钥和根证书
ssl_cert:SSL证书的路径,仅当协议设置为https时才应用
ssl_cert_key:SSL密钥的路径,仅当协议设置为https时才应用
secretkey_path:用于在复制策略中加密或解密远程注册表的密码的密钥路径

在这里插入图片描述

伪造证书
  • 创建 https 证书以及配置相关目录权限:
# 生成证书私钥
openssl genrsa -des3 -out server.key 2048
# 证书服务
openssl req -new -key server.key -out server.csr

在这里插入图片描述

  • 继续:
# 备份私钥
cp server.key server.key.org
# 转换为证书
openssl rsa -in server.key.org -out server.key
# 给证书签名
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
# 给所有证书授权
chmod 755 *

在这里插入图片描述

安装
  • 运行脚本进行安装:
./install.sh

在这里插入图片描述

  • 访问测试:https://hub.veli.com/。

在这里插入图片描述

  • 登录:默认管理员用户名/密码为admin / Harbor12345

在这里插入图片描述

上传镜像进行上传测试
  • 指定镜像仓库地址
vim /etc/docker/daemon.json

"insecure-registries": ["https://hub.veli.com"]
# 把证书添加到 /etc/docker/daemon.json 文件中,其中的每一个节点都做如下模式添加: 伪造证书
{"exec-opts": ["native.cgroupdriver=systemd"],"log-driver": "json-file","log-opts": {"max-size": "100m"},"insecure-registries": ["https://hub.veli.com"]}
# node01 添加 "insecure-registries": ["https://hub.veli.com"]
# node02 添加 "insecure-registries": ["https://hub.veli.com"]

在这里插入图片描述

  • 重启 docker-compose:
[root@centos116 harbor]# docker-compose restart
Restarting harbor-jobservice  ... done
Restarting nginx              ... done
Restarting harbor-ui          ... done
Restarting harbor-adminserver ... done
Restarting harbor-db          ... done
Restarting registry           ... done
Restarting harbor-log         ... done
  • 重启各个node结点的docker:
systemctl restart docker
  • 上传镜像到私有仓库:
# 下载测试镜像
docker pull hello-world
# 给镜像重新打标签
docker tag hello-world hub.veli.com/hello-world:latest
# 登录进行上传
docker login hub.veli.com
Username: admin
Password:
# 上传镜像
docker push hub.veli.com/hello-world:latest
  • push不成功:原因是没有指定项目
received unexpected HTTP status: 500 Internal Server Error
  • 进入到 harbor 管理界面新建项目 test,然后重新打 tag 再 push 镜像

在这里插入图片描述

docker tag hello-world hub.veli.com/test/hello-world:latest
docker push hub.veli.com/test/hello-world:latest

在这里插入图片描述

实战演练

Kubernetes基本指令

基础操作

# 创建并运行一个pod:deployment、rs、pod被自动创建
kubectl run my-nginx --image=nginx --port=80

# 增加创建副本数量
kubectl scale deployment/my-nginx --replicas = 3

# 添加service:kubectl expose将RC、Service、Deployment或Pod作为新的Kubernetes Service公开。
kubectl expose deployment/my-nginx --port=30000 --target-port=80
 
 # 编辑service配置文件
 kubectl edit svc/my-nginx
 
# 其他的基础指令
# 查看集群中有几个Node
kubectl get nodes

# 查看pod
kubectl get pod

# 查看服务详情信息
kubectl describe pod my-nginx-379829228-cwlbb

# 查看deployment对象
kubectl  get deployments

# 查看ReplicaSet对象
kubectl get rs

# 查看日志
kubectl logs my-nginx

# 登录 pod 内部容器
kubectl exec -it my-nginx -sh

# 删除pod
kubectl delete pod my-nginx-379829228-cwlbb

# 删除部署的my-nginx服务。彻底删除pod
$ kubectl delete deployment my-nginx
deployment "my-nginx" deleted

# 删除service服务
kubectl delete service my-nginx
  • 查看帮助文档:
kubectl --help
# 进一步查看指令的帮助文档
kubectl 指令名称 --help

命令手册

类型命令描述
基础命令create通过文件名或标准输入创建资源
ecpose将一个资源公开为一个新的Service
run在集群中运行一个特定的镜像
set在对象上设置特定的功能
get显示一个或多个资源
explain文档参考资料
edit使用默认的编辑器编辑一个资源
delete通过文件名,标准输入,资源名称或者标签选择器来删除资源
部署命令rollout管理资源的发布
rolling-update对给定的复制控制器滚动更新
scale扩容会缩容Pod数量,Deployment,ReplicaSet,RC或Job
autoscale创建一个自动选择扩容或缩容并设置Pod数量
集群管理命令certificate修改证书资源
cluster-info显示集群信息
top显示资源(CPU/Memory/Storage)使用,需要Heapster运行
cordon标记节点不可调
uncordon标记节点可调度
drain驱逐节点上的应用,准备下线维护
taint修改节点taint标记
故障诊断和调试命令describe显示特定资源或资源组的详细信息
logs在一个Pod中打印一个容器日志,如果Pod只有一个容器,容器名称是可选的
attach附加到一个运行的容器
exec执行命令到容器
port-forward转发一个或多个本地端口到一个pod
proxy运行一个proxy到Kubernetes API server
cp拷贝文件或者目录到容器中
auth检查授权
高级命令apply通过文件名或标准输入对资源应用配置
patch使用补丁修改,更新资源的字段
replace通过文件名或标准输入替换一个资源
convert不同的API版本之间转换配置文件
设置命令label更新资源上的标签
annotate更新资源上的注释
completion用于实现kubectl工具自动补全
其他命令api-versions打印受支持的API 版本
config修改kubeconfig文件(用于访问API,比如配置认证信息)
help所有命令帮助
plugin运行一个命令插件
version打印客户端和服务版本信息

K8S实战

服务如何部署?

  • 指令:
kubectl run myapp --image=hub.veli.com/springboot/00-primary-start:1.0 --port=8080
  • 查看 pod,结果出现了问题:

在这里插入图片描述

  • 想查看更多信息,可以 describe 这个失败的 Pod:
kubectl describe pod myapp-65c95b5dd-sscm9

在这里插入图片描述

  • 显示错误:Failed to pull image "hub.veli.com/springboot/00-primary-start:1.0"
  • 除了网络连接问题外,还有三个主要元凶:
    • 镜像 tag 不正确
    • 镜像不存在(或者是在另一个仓库)
    • Kubernetes 没有权限去拉那个镜像
  • 使用 docker pull 命令拉取镜像成功,那么很可能 Kubernetes 没有权限去拉取这个镜像。
  • 那么参考镜像拉取 Secrets 来解决这个问题。
  • 用 docker 登录私有仓库 harbor 后,会生成~/.docker/config.json文件,config.json文件内容如下:
{
	"auths": {
		"hub.veli.com": {
			"auth": "YWRtaW46SGFyYm9yMTIzNDU="
		}
	}
}
  • 再对上面的config.json进行base64加密,命令如下:
[root@centos108 ~]# cat ~/.docker/config.json | base64 -w 0
ewoJImF1dGhzIjogewoJCSJodWIudmVsaS5jb20iOiB7CgkJCSJhdXRoIjogIllXUnRhVzQ2U0dGeVltOXlNVEl6TkRVPSIKCQl9Cgl9Cn0K
  • 创建secret.yaml文件,文件内容如下:
apiVersion: v1
kind: Secret
metadata:
  name: mysecret
data:
  .dockerconfigjson: ewoJImF1dGhzIjogewoJCSJodWIudmVsaS5jb20iOiB7CgkJCSJhdXRoIjogIllXUnRhVzQ2U0dGeVltOXlNVEl6TkRVPSIKCQl9Cgl9Cn0K
type: kubernetes.io/dockerconfigjson
  • 创建secret,命令如下:
kubectl create -f secret.yaml
  • 接下来就可以进行服务部署了:
# 方式一
kubectl run myapp --image=hub.veli.com/springboot/00-primary-start:1.0 --port=8080
# 方式二
kubectl create deployment myapp --image=hub.veli.com/springboot/00-primary-start:1.0
  • 查看并访问之也是OK的:

在这里插入图片描述

  • 也可以通过 yaml 文件方式部署Pod或者Deployment:新建pod,用imagePullSecrets指定secret,pod的yaml文件示例如下:
# vim primary-start-pod.yaml
apiVersion: v1
kind: Pod  # 或 Deployment
metadata:
  name: myapp
spec:
  containers:
    - name: myapp
      image: hub.veli.com/springboot/00-primary-start:1.0
      imagePullPolicy: Always
  imagePullSecrets:
    - name: mysecret
  • 创建 pod,命令如下:
kubectl create -f primary-start-pod.yaml

服务如何实现扩容和自愈?

  • 指令:
kubectl scale deployment myapp --replicas=3

在这里插入图片描述

  • 查看发现扩容三个副本成功了。
  • 服务如何实现自愈:删除一个 pod,或是删除所有的 pod,观察 pod 副本数量是否和预期设定的数量(3 个) 。

在这里插入图片描述

  • 可以看到删除一个服务后,副本控制器会对服务进行重建工作,会保证服务数量与预期设定的数量一致。及时是全部删掉,副本控制器也会去自动帮助我们创建设定数量的POD。

在这里插入图片描述

  • 问题:删除 POD 肯定删除不了服务的,那么如何删除服务?
  • 答案:删除 RS 或者 Deployment,就可以删除所有的 Deployment、RS 对应的服务。

服务如何实现更新?

  • 需求:进行版本迭代,发不了新的版本,新的服务需要上线,如何实现服务滚动更新?
  • 指令:
kubectl set image deployment/myapp myapp=hub.veli.com/springboot/00-primary-start:2.0

在这里插入图片描述

服务如何实现负载均衡?

  • K8S 提供资源对象 Service,由这个 service 实现下面 pod 的负载均衡,通过 service 访问 pod。

在这里插入图片描述

  • 创建一个 service,由 Sevice 实现负载均衡,指令如下:
kubectl expose deployment myapp --target-port=8080 --port=88

在这里插入图片描述

使用的什么负载均衡策略呢?

  • 查看:Session Affinity 可以指定为 ClientIP 或者 None
kubectl describe service myapp

在这里插入图片描述

  • 默认是根据 kube-proxy 的负载均衡策略:随机策略。

在这里插入图片描述

DNS是否可以解析服务名称?

  • 在集群构建的时候,已经安装好了 dns 服务,因此可以利用 dns 解析服务名称,实现服务通信:

在这里插入图片描述

  • 这里的 DNS 就类似于原来微服务的注册中心。
  • 实验:登录 pod 内部容器,在容器内部 ping service 服务名称,看是否可以 ping 通。
  • 首先看下 dns 是否已经搭建:可以看到是有的,在前面搭建集群过程中已经搭建好了。

在这里插入图片描述

  • 验证 DNS 是否OK?
# 进入pod容器中
kubectl exec -it {POD-NAME} -- sh

在这里插入图片描述

  • 结果发现 ping 不通,如何解决? ---- 需要使用 ipvs 替换 iptables,操作是在所有节点上
# 开启内核支持
$ vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1

$ sysctl -p

# 开启ipvs支持
$ cat /etc/sysconfig/modules/ipvs.modules
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack

# 配置kube-proxy,在master上操作,因使用kubeadmin安装,所以操作方式如下
kubectl edit cm kube-proxy -n kube-system
configmap/kube-proxy edited

在这里插入图片描述

  • 在master重启kube-proxy:
kubectl  get pod -n kube-system | grep kube-proxy | awk '{print $1}' | xargs kubectl delete pod -n kube-system
  • 验证ipvs是否开启:

在这里插入图片描述

  • 这时再进入 pod 容器 ping 一下服务名就好使了:

在这里插入图片描述

  • 注意:这时的负载均衡策略已经变为 ipvs 的轮询策略了

在这里插入图片描述

外网如何访问内部服务?

在这里插入图片描述

  • Service IP 类型是 clusterIp,此 IP 类型不能对外网提供服务,因此需要修改 IP 类型为 NodePort,然后才能通过外网访问。
  • 修改指令:
kubectl edit svc myapp

在这里插入图片描述

  • 修改为 NodePort 类型后,再次查看Service,这个时候就可以通过宿主机IP+映射端口进行外网访问了:

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

讲文明的喜羊羊拒绝pua

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值