Kubernetes服务部署案例实战
<p> <span style="font-size: 13px">学习了K8S的基础知识,我们的目的就是解决我们服务的迁移,那么接下去通过几个案例来感受一下K8s部署带来的便捷与效率。</span></p><h3><span style="font-size: 15px">环境准备:</span></h3>
<p><span style="font-size: 13px"> 3个节点,然后我这边也安装了 Ingress。</span></p>
<p><span style="font-size: 13px"><img src="https://img2018.cnblogs.com/i-beta/1383365/201912/1383365-20191221143851053-495420838.png"></span></p>
<h3><span style="font-size: 15px">部署wordpress+mysql(Service:NodePort模式):</span></h3>
<p><span style="font-size: 13px">(1)创建wordpress命名空间</span></p>
<p><span style="font-size: 13px"> kubectl create namespace wordpress</span></p>
<p><span style="font-size: 13px"> kubectl get ns</span></p>
<p><span style="font-size: 13px">(2)创建wordpress-db.yaml文件,根据wordpress-db.yaml创建资源</span></p>
<div class="cnblogs_code">
<pre><span style="font-size: 13px">apiVersion: apps/<span style="color: rgba(0, 0, 0, 1)">v1beta1
kind: Deployment
metadata:
name: mysql</span>-<span style="color: rgba(0, 0, 0, 1)">deploy
</span><span style="color: rgba(0, 0, 255, 1)">namespace</span><span style="color: rgba(0, 0, 0, 1)">: wordpress
labels:
app: mysql
spec:
template:
metadata:
labels:
app: mysql
spec:
containers:
</span>-<span style="color: rgba(0, 0, 0, 1)"> name: mysql
image: mysql:</span><span style="color: rgba(128, 0, 128, 1)">5.6</span><span style="color: rgba(0, 0, 0, 1)">
imagePullPolicy: IfNotPresent
ports:
</span>- containerPort: <span style="color: rgba(128, 0, 128, 1)">3306</span><span style="color: rgba(0, 0, 0, 1)">
name: dbport
env:
</span>-<span style="color: rgba(0, 0, 0, 1)"> name: MYSQL_ROOT_PASSWORD
value: rootPassW0rd
</span>-<span style="color: rgba(0, 0, 0, 1)"> name: MYSQL_DATABASE
value: wordpress
</span>-<span style="color: rgba(0, 0, 0, 1)"> name: MYSQL_USER
value: wordpress
</span>-<span style="color: rgba(0, 0, 0, 1)"> name: MYSQL_PASSWORD
value: wordpress
volumeMounts:
</span>-<span style="color: rgba(0, 0, 0, 1)"> name: db
mountPath: </span>/<span style="color: rgba(0, 0, 255, 1)">var</span>/lib/<span style="color: rgba(0, 0, 0, 1)">mysql
volumes:
</span>-<span style="color: rgba(0, 0, 0, 1)"> name: db
hostPath:
path: </span>/<span style="color: rgba(0, 0, 255, 1)">var</span>/lib/<span style="color: rgba(0, 0, 0, 1)">mysql
</span>---<span style="color: rgba(0, 0, 0, 1)">
apiVersion: v1
kind: Service
metadata:
name: mysql
</span><span style="color: rgba(0, 0, 255, 1)">namespace</span><span style="color: rgba(0, 0, 0, 1)">: wordpress
spec:
selector:
app: mysql
ports:
</span>-<span style="color: rgba(0, 0, 0, 1)"> name: mysqlport
protocol: TCP
port: </span><span style="color: rgba(128, 0, 128, 1)">3306</span><span style="color: rgba(0, 0, 0, 1)">
targetPort: dbport</span></span></pre>
</div>
<p><span style="font-size: 13px"> kubectl apply -f wordpress-db.yaml</span></p>
<p><span style="font-size: 13px"> kubectl get pods -n wordpress</span></p>
<p><span style="font-size: 13px"><img src="https://img2018.cnblogs.com/i-beta/1383365/201912/1383365-20191221165251638-1797938149.png"></span></p>
<p><span style="font-size: 13px"> kubectl get svc mysql -n wordpress</span></p>
<p><span style="font-size: 13px"><img src="https://img2018.cnblogs.com/i-beta/1383365/201912/1383365-20191221165313033-2058582436.png"></span></p>
<p><span style="font-size: 13px"> kubectl describe svc mysql -n wordpress 记录下 Endpoints的IP 或者IP ,需要配置到wordpress里面。</span></p>
<p><span style="font-size: 13px"> <img src="https://img2018.cnblogs.com/i-beta/1383365/201912/1383365-20191221165414084-1895728490.png"></span></p>
<p><span style="font-size: 13px">(3)创建wordpress.yaml文件,根据wordpress.yaml创建资源</span></p>
<div class="cnblogs_code">
<pre><span style="font-size: 13px">apiVersion: apps/<span style="color: rgba(0, 0, 0, 1)">v1beta1
kind: Deployment
metadata:
name: wordpress</span>-<span style="color: rgba(0, 0, 0, 1)">deploy
</span><span style="color: rgba(0, 0, 255, 1)">namespace</span><span style="color: rgba(0, 0, 0, 1)">: wordpress
labels:
app: wordpress
spec:
template:
metadata:
labels:
app: wordpress
spec:
containers:
</span>-<span style="color: rgba(0, 0, 0, 1)"> name: wordpress
image: wordpress
imagePullPolicy: IfNotPresent
ports:
</span>- containerPort: <span style="color: rgba(128, 0, 128, 1)">80</span><span style="color: rgba(0, 0, 0, 1)">
name: wdport
env:
</span>-<span style="color: rgba(0, 0, 0, 1)"> name: WORDPRESS_DB_HOST
value: </span><span style="color: rgba(128, 0, 128, 1)">192.168</span>.<span style="color: rgba(128, 0, 128, 1)">190.102</span>:<span style="color: rgba(128, 0, 128, 1)">3306</span>
-<span style="color: rgba(0, 0, 0, 1)"> name: WORDPRESS_DB_USER
value: wordpress
</span>-<span style="color: rgba(0, 0, 0, 1)"> name: WORDPRESS_DB_PASSWORD
value: wordpress
</span>---<span style="color: rgba(0, 0, 0, 1)">
apiVersion: v1
kind: Service
metadata:
name: wordpress
</span><span style="color: rgba(0, 0, 255, 1)">namespace</span><span style="color: rgba(0, 0, 0, 1)">: wordpress
spec:
type: NodePort
selector:
app: wordpress
ports:
</span>-<span style="color: rgba(0, 0, 0, 1)"> name: wordpressport
protocol: TCP
port: </span><span style="color: rgba(128, 0, 128, 1)">80</span><span style="color: rgba(0, 0, 0, 1)">
targetPort: wdport</span></span></pre>
</div>
<p><span style="font-size: 13px"> kubectl apply -f wordpress.yaml #修改其中mysql的ip地址,其实也可以使用service的name:mysql</span></p>
<p><span style="font-size: 13px"> kubectl get pods -n wordpress </span></p>
<p><span style="font-size: 13px"><img src="https://img2018.cnblogs.com/i-beta/1383365/201912/1383365-20191221170238682-1383018873.png"></span></p>
<p><span style="font-size: 13px"> kubectl get svc -n wordpress # 获取到转发后的端口,如这里的30078</span></p>
<p><span style="font-size: 13px"><img src="https://img2018.cnblogs.com/i-beta/1383365/201912/1383365-20191221170114859-643746613.png"></span></p>
<p><span style="font-size: 13px">(6)访问测试,win上访问集群中任意宿主机节点的IP:30078</span></p>
<p> <img src="https://img2018.cnblogs.com/i-beta/1383365/201912/1383365-20191221171255154-1247030984.png"></p>
<h3><span style="font-size: 15px">部署Spring Boot项目(Ingress):</span></h3>
<p> <span style="font-size: 13px">流程:确定服务-->编写Dockerfile制作镜像-->上传镜像到仓库-->编写K8S文件-->创建</span></p>
<p><span style="font-size: 13px">(1)准备Spring Boot项目springboot-demo</span></p>
<div class="cnblogs_code">
<pre><span style="font-size: 13px"><span style="color: rgba(0, 0, 0, 1)">@RestController
@RequestMapping(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">wuzz</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> TestController {
@RequestMapping(value </span>= <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">/k8s</span><span style="color: rgba(128, 0, 0, 1)">"</span>, method =<span style="color: rgba(0, 0, 0, 1)"> {RequestMethod.GET})
</span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> String k8s() {
</span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Hello Kubernetes .....</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
}
}</span></span></pre>
</div>
<p><span style="font-size: 13px">(2) mvn clean install生成xxx.jar,并且上传到 linux 自定义目录下(我这边是 /mysoft)</span></p>
<p><span style="font-size: 13px"><img src="https://img2018.cnblogs.com/i-beta/1383365/201912/1383365-20191221172022888-908690245.png"></span></p>
<p><span style="font-size: 13px">(3)编写Dockerfile文件 cd /mysoft 下 vi Dockerfile</span></p>
<div class="cnblogs_code">
<pre><span style="font-size: 13px">FROM openjdk:<span style="color: rgba(128, 0, 128, 1)">8</span>-jre-<span style="color: rgba(0, 0, 0, 1)">alpine
COPY springboot</span>-demo-<span style="color: rgba(128, 0, 128, 1)">1.0</span>-SNAPSHOT.jar /mysoft/springboot-<span style="color: rgba(0, 0, 0, 1)">demo.jar
ENTRYPOINT [</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">java</span><span style="color: rgba(128, 0, 0, 1)">"</span>,<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">-jar</span><span style="color: rgba(128, 0, 0, 1)">"</span>,<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">/mysoft/springboot-demo.jar</span><span style="color: rgba(128, 0, 0, 1)">"</span>]</span></pre>
</div>
<p><span style="font-size: 13px">(4)根据Dockerfile创建image</span></p>
<p><span style="font-size: 13px"> docker build -t springboot-demo-image .</span></p>
<p><span style="font-size: 13px"><img src="https://img2018.cnblogs.com/i-beta/1383365/201912/1383365-20191221172230275-1788709233.png"></span></p>
<p><span style="font-size: 13px">(5)使用docker run创建container</span></p>
<p><span style="font-size: 13px"> docker run -d --name s1 springboot-demo-image</span></p>
<p><span style="font-size: 13px">(6)访问测试</span></p>
<p><span style="font-size: 13px"> docker inspect s1</span></p>
<p><span style="font-size: 13px"> curl ip:8080/wuzz/k8s</span></p>
<p><span style="font-size: 13px"><img src="https://img2018.cnblogs.com/i-beta/1383365/201912/1383365-20191221172522438-985004268.png"></span></p>
<p><span style="font-size: 13px">(7)将镜像推送到镜像仓库</span></p>
<p><span style="font-size: 13px"> # 登录阿里云镜像仓库</span></p>
<p><span style="font-size: 13px"><code class="text-muted" data-spm-anchor-id="5176.8351553.0.i1.52d61991ysphVa">sudo docker login --username=随风去wuzz registry.cn-hangzhou.aliyuncs.com</code></span></p>
<p><span style="font-size: 13px">docker tag springboot-demo-image registry.cn-hangzhou.aliyuncs.com/wuzz-docker/springboot-demo-image:v1.0</span></p>
<p><span style="font-size: 13px">docker push registry.cn-hangzhou.aliyuncs.com/wuzz-docker/springboot-demo-image:v1.0</span></p>
<p><span style="font-size: 13px"> <img src="https://img2018.cnblogs.com/i-beta/1383365/201912/1383365-20191221173124832-447805266.png"></span></p>
<p><span style="font-size: 13px"> 推送完成。</span></p>
<p><span style="font-size: 13px"> <img src="https://img2018.cnblogs.com/i-beta/1383365/201912/1383365-20191221173141158-2124965188.png"></span></p>
<p><span style="font-size: 13px">(8)编写Kubernetes配置文件vi springboot-demo.yaml</span></p>
<div class="cnblogs_code">
<pre><span style="font-size: 13px"><span style="color: rgba(0, 0, 0, 1)"># 以Deployment部署Pod
apiVersion: apps</span>/<span style="color: rgba(0, 0, 0, 1)">v1
kind: Deployment
metadata:
name: springboot</span>-<span style="color: rgba(0, 0, 0, 1)">demo
spec:
selector:
matchLabels:
app: springboot</span>-<span style="color: rgba(0, 0, 0, 1)">demo
replicas: </span><span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">
template:
metadata:
labels:
app: springboot</span>-<span style="color: rgba(0, 0, 0, 1)">demo
spec:
containers:
</span>- name: springboot-<span style="color: rgba(0, 0, 0, 1)">demo
image: registry.cn-hangzhou.aliyuncs.com/wuzz-docker/springboot-demo-image:v1.0</span><span style="color: rgba(0, 0, 0, 1)">
ports:
</span>- containerPort: <span style="color: rgba(128, 0, 128, 1)">8080</span>
---<span style="color: rgba(0, 0, 0, 1)">
# 创建Pod的Service
apiVersion: v1
kind: Service
metadata:
name: springboot</span>-<span style="color: rgba(0, 0, 0, 1)">demo
spec:
ports:
</span>- port: <span style="color: rgba(128, 0, 128, 1)">80</span><span style="color: rgba(0, 0, 0, 1)">
protocol: TCP
targetPort: </span><span style="color: rgba(128, 0, 128, 1)">8080</span><span style="color: rgba(0, 0, 0, 1)">
selector:
app: springboot</span>-<span style="color: rgba(0, 0, 0, 1)">demo
</span>---<span style="color: rgba(0, 0, 0, 1)">
# 创建Ingress,定义访问规则,一定要记得提前创建好nginx ingress controller
apiVersion: extensions</span>/<span style="color: rgba(0, 0, 0, 1)">v1beta1
kind: Ingress
metadata:
name: springboot</span>-<span style="color: rgba(0, 0, 0, 1)">demo
spec:
rules:
</span>-<span style="color: rgba(0, 0, 0, 1)"> host: tomcat.wuzz.com
http:
paths:
</span>- path: /<span style="color: rgba(0, 0, 0, 1)">
backend:
serviceName: springboot</span>-<span style="color: rgba(0, 0, 0, 1)">demo
servicePort: </span><span style="color: rgba(128, 0, 128, 1)">80</span></span></pre>
</div>
<p><span style="font-size: 13px"> 生成 pod :kubectl apply -f springboot-demo.yaml</span></p>
<p><span style="font-size: 13px">(9)查看资源</span></p>
<p><span style="font-size: 13px"> kubectl get pods</span></p>
<p><span style="font-size: 13px"><img src="https://img2018.cnblogs.com/i-beta/1383365/201912/1383365-20191221174137260-184479582.png"></span></p>
<p><span style="font-size: 13px"> kubectl get pods -o wide</span></p>
<p><span style="font-size: 13px"><img src="https://img2018.cnblogs.com/i-beta/1383365/201912/1383365-20191221174154034-370523149.png"></span></p>
<p><span style="font-size: 13px"> curl 192.168.190.103:8080/wuzz/k8s</span></p>
<p><span style="font-size: 13px"><img src="https://img2018.cnblogs.com/i-beta/1383365/201912/1383365-20191221174232384-1465247099.png"></span></p>
<p><span style="font-size: 13px"> kubectl get svc</span></p>
<p><span style="font-size: 13px"><img src="https://img2018.cnblogs.com/i-beta/1383365/201912/1383365-20191221174245792-620245275.png"></span></p>
<p><span style="font-size: 13px"> kubectl scale deploy springboot-demo --replicas=5</span></p>
<p><span style="font-size: 13px">(10)win配置hosts文件[一定要记得提前创建好nginx ingress controller] </span></p>
<p><span style="font-size: 13px"> 192.168.1.102 tomcat.wuzz.com</span></p>
<p><span style="font-size: 13px">(11)win浏览器访问</span></p>
<p><em><img src="https://img2018.cnblogs.com/i-beta/1383365/201912/1383365-20191221174905495-1628590326.png"></em></p>
<h3><span style="font-size: 15px">部署传统分布式服务(user/order)及注册中心(Nacos):</span></h3>
<p> <span style="font-size: 13px">将user/order服务注册到nacos,user服务能够找到order服务。</span></p>
<p><span style="font-size: 13px">(1).启动两个Spring Boot项目,两者Pom.xml如下:</span></p>
<div class="cnblogs_code">
<pre><span style="font-size: 13px"><properties>
<project.build.sourceEncoding>UTF-<span style="color: rgba(128, 0, 128, 1)">8</span></project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-<span style="color: rgba(128, 0, 128, 1)">8</span></project.reporting.outputEncoding>
<java.version><span style="color: rgba(128, 0, 128, 1)">1.8</span></java.version>
<spring-cloud.version>Greenwich.SR1</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version><span style="color: rgba(128, 0, 128, 1)">2.1</span>.<span style="color: rgba(128, 0, 128, 1)">6</span>.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version><span style="color: rgba(128, 0, 128, 1)">4.5</span>.<span style="color: rgba(128, 0, 128, 1)">10</span></version>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<!-- SpringCloud 所有子项目 版本集中管理. 统一所有SpringCloud依赖项目的版本依赖-->
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version><span style="color: rgba(128, 0, 128, 1)">0.9</span>.<span style="color: rgba(128, 0, 128, 1)">0</span>.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version><span style="color: rgba(128, 0, 128, 1)">2.1</span>.<span style="color: rgba(128, 0, 128, 1)">6</span>.RELEASE</version>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version><span style="color: rgba(128, 0, 128, 1)">2.1</span>.<span style="color: rgba(128, 0, 128, 1)">6</span>.RELEASE</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build></span></pre>
</div>
<p><span style="font-size: 13px"> application.properties :user端口8081,order9090,记得修改对应application.name</span></p>
<div class="cnblogs_code">
<pre><span style="font-size: 13px">server.port=<span style="color: rgba(128, 0, 128, 1)">8081</span><span style="color: rgba(0, 0, 0, 1)">
spring.application.name</span>=<span style="color: rgba(0, 0, 0, 1)">user
spring.cloud.nacos.discovery.server</span>-addr=<span style="color: rgba(128, 0, 128, 1)">192.168</span>.<span style="color: rgba(128, 0, 128, 1)">1.101</span>:<span style="color: rgba(128, 0, 128, 1)">8848</span></span></pre>
</div>
<p><span style="font-size: 13px"> user 需要提供一个接口以供测试:</span></p>
<div class="cnblogs_code">
<pre><span style="font-size: 13px"><span style="color: rgba(0, 0, 0, 1)">@RestController
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> TestController {
@Autowired
</span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> DiscoveryClient discoveryClient;
@RequestMapping(value </span>= <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">/k8s</span><span style="color: rgba(128, 0, 0, 1)">"</span>, method =<span style="color: rgba(0, 0, 0, 1)"> {RequestMethod.GET})
</span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> String insert() {
List</span><ServiceInstance> list = discoveryClient.getInstances(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">order</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
ServiceInstance serviceInstance </span>= list.<span style="color: rgba(0, 0, 255, 1)">get</span>(<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">);
URI uri </span>=<span style="color: rgba(0, 0, 0, 1)"> serviceInstance.getUri();
System.</span><span style="color: rgba(0, 0, 255, 1)">out</span><span style="color: rgba(0, 0, 0, 1)">.println(uri);
testUri(uri.toString());
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> list.toString();
}
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> testUri(String uri) {
URL url </span>= <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)"> {
url </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> URL(uri);
URLConnection urlConnection </span>=<span style="color: rgba(0, 0, 0, 1)"> url.openConnection();
urlConnection.connect();
System.</span><span style="color: rgba(0, 0, 255, 1)">out</span>.println(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">连接可用</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
} </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (MalformedURLException e) {
e.printStackTrace();
} </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (IOException e) {
e.printStackTrace();
}
}
}</span></span></pre>
</div>
<p><span style="font-size: 13px"> 然后查看nacos server的服务列表:</span></p>
<p><span style="font-size: 13px"><img src="https://img2018.cnblogs.com/i-beta/1383365/201912/1383365-20191223145925892-289497200.png"></span></p>
<p><span style="font-size: 13px"> 为了验证user能够发现order的地址,访问localhost:8081/k8s,查看日志输出,从而测试是否可以ping通order地址</span></p>
<p><span style="font-size: 13px"><img src="https://img2018.cnblogs.com/i-beta/1383365/201912/1383365-20191223150240316-1102923591.png"></span></p>
<p><span style="font-size: 13px"> (2) 本地测试无误以后将两个项目打成 jar 包,丢到 linux 目录中。编写 Dockerfile 文件:</span></p>
<div class="cnblogs_code">
<pre><span style="font-size: 13px">FROM openjdk:<span style="color: rgba(128, 0, 128, 1)">8</span>-jre-<span style="color: rgba(0, 0, 0, 1)">alpine
COPY user</span>-<span style="color: rgba(128, 0, 128, 1)">1.0</span>.<span style="color: rgba(128, 0, 128, 1)">0</span>-SNAPSHOT.jar /<span style="color: rgba(0, 0, 0, 1)">user.jar
ENTRYPOINT [</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">java</span><span style="color: rgba(128, 0, 0, 1)">"</span>,<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">-jar</span><span style="color: rgba(128, 0, 0, 1)">"</span>,<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">/user.jar</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">]
</span>-------<span style="color: rgba(0, 0, 0, 1)">
FROM openjdk:</span><span style="color: rgba(128, 0, 128, 1)">8</span>-jre-<span style="color: rgba(0, 0, 0, 1)">alpine
COPY order</span>-<span style="color: rgba(128, 0, 128, 1)">0.0</span>.<span style="color: rgba(128, 0, 128, 1)">1</span>-SNAPSHOT.jar /<span style="color: rgba(0, 0, 0, 1)">order.jar
ENTRYPOINT [</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">java</span><span style="color: rgba(128, 0, 0, 1)">"</span>,<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">-jar</span><span style="color: rgba(128, 0, 0, 1)">"</span>,<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">/order.jar</span><span style="color: rgba(128, 0, 0, 1)">"</span>]</span></pre>
</div>
<p><span style="font-size: 13px"> 构建镜像:</span></p>
<div class="cnblogs_code">
<pre><span style="font-size: 13px">docker build -t user-image:v1.<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)"> .
docker build </span>-t order-image:v1.<span style="color: rgba(128, 0, 128, 1)">0</span> .</span></pre>
</div>
<p><span style="font-size: 13px"> 将镜像推送到远程私人仓库:我这里选择了阿里云</span></p>
<div class="cnblogs_code">
<pre><span style="font-size: 13px"><span style="color: rgba(0, 0, 0, 1)">#打 tag
docker tag user</span>-image:v1.<span style="color: rgba(128, 0, 128, 1)">0</span> registry.cn-hangzhou.aliyuncs.com/wuzz-docker/user-image:v1.<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">
docker tag order</span>-image:v1.<span style="color: rgba(128, 0, 128, 1)">0</span> registry.cn-hangzhou.aliyuncs.com/wuzz-docker/order-image:v1.<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">
#推送
docker push registry.cn</span>-hangzhou.aliyuncs.com/wuzz-docker/user-<span style="color: rgba(0, 0, 0, 1)">image
docker push registry.cn</span>-hangzhou.aliyuncs.com/wuzz-docker/order-image </span></pre>
</div>
<p><span style="font-size: 13px">(3) 编写 user.yaml ,order.yaml 文件:</span></p>
<p><span style="font-size: 13px"> user.yaml</span></p>
<div class="cnblogs_code">
<pre><span style="font-size: 13px"><span style="color: rgba(0, 0, 0, 1)"># 以Deployment部署Pod
apiVersion: apps</span>/<span style="color: rgba(0, 0, 0, 1)">v1
kind: Deployment
metadata:
name: user
spec:
selector:
matchLabels:
app: user
replicas: </span><span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">
template:
metadata:
labels:
app: user
spec:
containers:
</span>-<span style="color: rgba(0, 0, 0, 1)"> name: user
image: registry.cn</span>-hangzhou.aliyuncs.com/wuzz-docker/user-image:v1.<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">
ports:
</span>- containerPort: <span style="color: rgba(128, 0, 128, 1)">8081</span>
---<span style="color: rgba(0, 0, 0, 1)">
# 创建Pod的Service
apiVersion: v1
kind: Service
metadata:
name: user
spec:
ports:
</span>- port: <span style="color: rgba(128, 0, 128, 1)">80</span><span style="color: rgba(0, 0, 0, 1)">
protocol: TCP
targetPort: </span><span style="color: rgba(128, 0, 128, 1)">8081</span><span style="color: rgba(0, 0, 0, 1)">
selector:
app: user
</span>---<span style="color: rgba(0, 0, 0, 1)">
# 创建Ingress,定义访问规则,一定要记得提前创建好nginx ingress controller
apiVersion: extensions</span>/<span style="color: rgba(0, 0, 0, 1)">v1beta1
kind: Ingress
metadata:
name: user
spec:
rules:
</span>-<span style="color: rgba(0, 0, 0, 1)"> host: k8s.demo.gper.club
http:
paths:
</span>- path: /<span style="color: rgba(0, 0, 0, 1)">
backend:
serviceName: user
servicePort: </span><span style="color: rgba(128, 0, 128, 1)">80</span></span></pre>
</div>
<p><span style="font-size: 13px"> order.yaml:</span></p>
<div class="cnblogs_code">
<pre><span style="font-size: 13px"><span style="color: rgba(0, 0, 0, 1)"># 以Deployment部署Pod
apiVersion: apps</span>/<span style="color: rgba(0, 0, 0, 1)">v1
kind: Deployment
metadata:
name: order
spec:
selector:
matchLabels:
app: order
replicas: </span><span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">
template:
metadata:
labels:
app: order
spec:
containers:
</span>-<span style="color: rgba(0, 0, 0, 1)"> name: order
image: registry.cn</span>-hangzhou.aliyuncs.com/wuzz-docker/order-image:v1.<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">
ports:
</span>- containerPort: <span style="color: rgba(128, 0, 128, 1)">9090</span>
---<span style="color: rgba(0, 0, 0, 1)">
# 创建Pod的Service
apiVersion: v1
kind: Service
metadata:
name: order
spec:
ports:
</span>- port: <span style="color: rgba(128, 0, 128, 1)">80</span><span style="color: rgba(0, 0, 0, 1)">
protocol: TCP
targetPort: </span><span style="color: rgba(128, 0, 128, 1)">9090</span><span style="color: rgba(0, 0, 0, 1)">
selector:
app: order</span></span></pre>
</div>
<p><span style="font-size: 13px">(4) 构建 pods :kubectl apply -f user.yaml</span></p>
<p><span style="font-size: 13px"><img src="https://img2018.cnblogs.com/i-beta/1383365/201912/1383365-20191223155014746-548339601.png"></span></p>
<p><span style="font-size: 13px"> kubectl get pods 查看pods</span></p>
<p><span style="font-size: 13px"> kubectl get pods -o wide 查看pods详情 </span></p>
<p><span style="font-size: 13px"> kubectl get svc 查看service</span></p>
<p><span style="font-size: 13px"> kubectl get ingress 查看ingress网络</span></p>
<p><img src="https://img2018.cnblogs.com/i-beta/1383365/201912/1383365-20191223155248932-2012319242.png"></p>
<p> <span style="font-size: 13px">这个时候我通过:kubectl logs -f <pod-name> [主要是为了看日志输出,证明user能否访问order] 发现这个pod报错了,连接不上,经过测试 在本地跟直接在linux上通过java -jar 运行都是可以注册的 ,没问题。</span></p>
<p><span style="font-size: 13px"><img src="https://img2018.cnblogs.com/i-beta/1383365/201912/1383365-20191224111655048-762604689.png"></span></p>
<p><span style="font-size: 13px"> 这个时候我们可以 docker exec -it containerId /bin/sh 进入对用容器 ping 一下 这里报错的地址,发现 ping 不通。这个时候获取到对应的 pod 的 IP:</span></p>
<p><span style="font-size: 13px"><img src="https://img2018.cnblogs.com/i-beta/1383365/201912/1383365-20191224105719431-1554163640.png"></span></p>
<p><span style="font-size: 13px"> 在节点 192.168.190.114 增加一条路由规则:<code class="language-python"><span class="hljs-comment">/sbin/iptables -t nat -I POSTROUTING -s 192.168.190.0/24 -j MASQUERADE</span></code></span></p>
<p><span style="font-size: 13px"> 然后会发现注册成功:</span></p>
<p><span style="font-size: 13px"> <img src="https://img2018.cnblogs.com/i-beta/1383365/201912/1383365-20191224105634786-1397189573.png"></span></p>
<p> <img src="https://img2018.cnblogs.com/i-beta/1383365/201912/1383365-20191224105646274-1052321044.png"></p>
<p> 可以发现,注册到nacos server上的服务ip地址为pod的ip,比如192.168.190.114/192.168.190.115 .</p>
<p> <img src="https://img2018.cnblogs.com/i-beta/1383365/201912/1383365-20191224105719431-1554163640.png"></p>
<p> (5) 测试:通过浏览器访问我们配置的 Ingress 的对应路径</p>
<p><img src="https://img2018.cnblogs.com/i-beta/1383365/201912/1383365-20191224110037523-1746927886.png"></p>
<p> 看一下 pod 的日志发现调用没问题。如果服务都是在K8s集群中,最终将pod ip注册到了nacos server,那么最终服务通过pod ip发现。</p>
<p> <img src="https://img2018.cnblogs.com/i-beta/1383365/201912/1383365-20191224105938023-1425528908.png"></p>
<p><strong>假如user现在不在K8s集群中,order在K8s集群中:</strong></p>
<p><span style="font-size: 13px"><strong> </strong>比如user使用本地idea中的,order使用上面K8s中的 。</span></p>
<ul>
<li><span style="font-size: 13px">启动本地idea中的user服务</span></li>
<li><span style="font-size: 13px">查看nacos server中的user服务列表</span></li>
<li><span style="font-size: 13px">访问本地的localhost:8081/ks,并且观察idea中的日志打印,发现访问的是order的pod id,此时肯定是不能进行服务调用的,怎么解决呢?</span></li>
</ul>
<p> <span style="font-size: 13px">之所以访问不了,是因为order的pod ip在外界访问不了,怎么解决呢?</span></p>
<ol>
<li><span style="font-size: 13px">可以将pod启动时所在的宿主机的ip写到容器中,也就是pod id和宿主机ip有一个对应关系</span></li>
<li><span style="font-size: 13px">pod和宿主机使用host网络模式,也就是pod直接用宿主机的ip,但是如果服务高可用会有端口冲突问题[可以使用pod的调度策略,尽可能在高可用的情况下,不会将pod调度在同一个worker中]</span></li>
</ol>
<p><span style="font-size: 13px"> 我们来演示一个host网络模式的方式,修改order.yaml文件,修改之后apply之前可以看一下各个节点的9090端口是否被占用</span></p>
<div class="cnblogs_code">
<pre>apiVersion: apps/<span style="color: rgba(0, 0, 0, 1)">v1
kind: Deployment
metadata:
name: order
spec:
selector:
matchLabels:
app: order
replicas: </span><span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">
template:
metadata:
labels:
app: order
spec:<br> #主要是加上host映射
hostNetwork: </span><span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">
containers:
</span>-<span style="color: rgba(0, 0, 0, 1)"> name: order
image: registry.cn</span>-hangzhou.aliyuncs.com/wuzz-docker/order-image:v1.<span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">
ports:
</span>- containerPort: <span style="color: rgba(128, 0, 128, 1)">9090</span>
---<span style="color: rgba(0, 0, 0, 1)">
# 创建Pod的Service
apiVersion: v1
kind: Service
metadata:
name: order
spec:
ports:
</span>- port: <span style="color: rgba(128, 0, 128, 1)">80</span><span style="color: rgba(0, 0, 0, 1)">
protocol: TCP
targetPort: </span><span style="color: rgba(128, 0, 128, 1)">9090</span><span style="color: rgba(0, 0, 0, 1)">
selector:
app: order</span></pre>
</div>
<p> <span style="font-size: 13px">构建之前记得把之前哪个删掉:kubectl apply -f order.yaml </span></p>
<p><span style="font-size: 13px"> kubectl get pods -o wide --->找到pod运行在哪个机器上,比如w2,查看w2上的9090端口是否启动</span></p>
<p> 构建完,启动本地的user服务,看是否注册上去:</p>
<p> <img src="https://img2018.cnblogs.com/i-beta/1383365/201912/1383365-20191224112140183-683818141.png"></p>
<p> <img src="https://img2018.cnblogs.com/i-beta/1383365/201912/1383365-20191224111458702-214924290.png"></p>
<p> 访问本地发 user服务:</p>
<p><img src="https://img2018.cnblogs.com/i-beta/1383365/201912/1383365-20191224112058948-693350056.png"></p>
<p> </p>
<p> 查看控制台的输出信息:</p>
<p><img src="https://img2018.cnblogs.com/i-beta/1383365/201912/1383365-20191224112108900-2100965339.png"></p><br><br>
来源:https://www.cnblogs.com/wuzhenzhao/p/12076827.html
頁:
[1]