JavaEE 企业级分布式高级架构师(十八)容器虚拟化技术(3)
Kubernetes学习笔记
- K8S集群服务搭建
- 环境准备
- 机器环境
- 依赖环境
- docker部署
- kubeadm(一键安装k8s)
- 集群安装
- 依赖镜像
- k8s部署
- flannel插件
- 节点Join
- 节点运行 kubectl 出错
- 私有仓库
- 环境准备
- 安装Compose
- 安装harbor
- 准备工作
- 安装配置
- 伪造证书
- 安装
- 上传镜像进行上传测试
- 实战演练
- Kubernetes基本指令
- 基础操作
- 命令手册
- K8S实战
- 服务如何部署?
- 服务如何实现扩容和自愈?
- 服务如何实现更新?
- 服务如何实现负载均衡?
- DNS是否可以解析服务名称?
- 外网如何访问内部服务?
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 -c2 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.gpghttp://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)
dodocker 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
- 部署flannel网络插件时候,注意网络连通的问题,可以先去到 github 进行下载:https://github.com/coreos/flannel/releases
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
- github.com 官网地址:https://github.com/docker/compose/releases,选择自己需要安装的版本
- 在线下载 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
- github官方地址:https://github.com/goharbor/harbor/releases
准备工作
- 追加 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: myappimage: hub.veli.com/springboot/00-primary-start:1.0imagePullPolicy: AlwaysimagePullSecrets:- 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+映射端口进行外网访问了:
JavaEE 企业级分布式高级架构师(十八)容器虚拟化技术(3)相关推荐
- JavaEE 企业级分布式高级架构师(十三)微服务框架 SpringCloud (H 版)(1)
Spring Cloud学习笔记 Spring Cloud入门 分布式技术图谱 Spring Cloud简介 官网介绍 百度百科 总结 Spring Cloud的国内使用情况 Spring Cloud ...
- JavaEE 企业级分布式高级架构师(二十)RocketMQ学习笔记(2)
RocketMQ学习笔记 进阶篇 消息样例 普通消息 消息发送 发送同步消息 发送异步消息 单向发送消息 三种发送方式的对比 消费消息 顺序消息 如何保证顺序 顺序的实现 MessageListene ...
- JavaEE 企业级分布式高级架构师(十五)FastDFS分布式文件服务器(1)
FastDFS学习笔记 FastDFS介绍 传统文件存储弊端 FastDFS是什么 为什么使用FastDFS FastDFS架构原理分析 架构整体分析 Tracker Server跟踪服务器 Stor ...
- JavaEE 企业级分布式高级架构师(十五)FastDFS分布式文件服务器(3)
FastDFS学习笔记 Java操作FastDFS 测试文件上传 Spring Boot整合FastDFS 实现图片压缩 FastDFS主从文件 应用背景 解决办法 流程说明 Java代码 Nginx ...
- JavaEE 企业级分布式高级架构师(十七)ElasticSearch全文检索(1)
ElasticSearch学习笔记 基础篇 问题思考 大规模数据如何检索? 传统数据库的应对解决方案? 非关系型数据库的解决方案? 另辟蹊径--完全把数据放入内存怎么样? 全文检索技术 什么是全文检索 ...
- JavaEE 企业级分布式高级架构师(六)MySQL学习笔记(6)
MySQL学习笔记 性能优化篇 性能优化的思路 慢查询日志 慢查询日志介绍 开启慢查询功能 演示一 演示二 分析慢查询日志 MySQL自带的mysqldumpslow 使用percona-toolki ...
- JavaEE 企业级分布式高级架构师(四)SpringMVC学习笔记(4)
SpringMVC学习笔记 高级应用篇 ControllerAdvice @ControllerAdvice @ModelAttribute 作用于方法 作用于方法参数 @InitBinder @Ex ...
- JavaEE 企业级分布式高级架构师课程_汇总贴
总目录: 第一课(2018.7.10) 01 mybatis框架整体概况(2018.7.10)- 转载于:https://www.cnblogs.com/wangjunwei/p/10424103.h ...
- JavaEE 企业级分布式高级架构师(十七)ElasticSearch全文检索(5)
ElasticSearch学习笔记 性能优化篇 ElasticSearch部署 选择合理的硬件配置--尽可能使用 SSD 给JVM配置机器一半的内存,但是不建议超过32G 规模较大的集群配置专有主节点 ...
最新文章
- 2021-05-09
- 文巾解题 793. 阶乘函数后 K 个零
- 设计出python_Python: 实际项目中抽象出的小项目设计
- 为什么使用了索引,查询还是慢?
- nodejs 30行代码 爬豆瓣电影数据
- python刷题+leetcode(第三部分)
- TypeScript泛型约束
- Collections.sort new Compartor 用法
- 高通9008刷机,刷机参考
- 雷达原理---时频分析--2.短时傅里叶变换
- C++程序员应了解的那些事(19)C++ trivial(平凡的)和non-trivial(非平凡的)
- 【ZZ】从入门到高阶,你需要刷哪些书?丨高中物理竞赛辅导书推荐
- Python笔记_81_结算页面_订单模型_优惠券
- 安卓android_rom定制,移植,安卓Android_ROM定制、移植:第一~~八篇(全)
- Android 仿京东商城购物车及源码
- 解决win10资源管理器关后电脑黑屏问题
- 小白都能学会的python+opencv,带你从人脸识别做到车牌识别,成为别人口中赞叹的高手!
- EventBus3 简单使用及注意点
- (一)ROS Kinetic的安装与配置,
- 最全中国科学技术大学计算机学院课程资源!
热门文章
- 客运遭遇路梗塞 堵车堵哭乘务员
- tsp问题用蚁群算法java实现_TSP解决之道——蚁群算法
- 2013年末的简单回想
- 算法真题02 - 将n个球装入m个盒子
- java取素数(质数)
- linux c遍历路径,linux c 目录和子目录遍历
- ASP.NET网站与Discuz!NT论坛整合
- 软件工程驻足篇章:第十七周和BugPhobia团队漫长的道别
- 关于cv::imread读取图片类型的初探
- 三年巨亏20亿,“AI四小龙“云从科技“血拼”上市