请叫雷轰 發表於 2019-12-21 14:28:00

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&nbsp;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&nbsp; &nbsp;或者IP ,需要配置到wordpress里面。</span></p>
<p><span style="font-size: 13px">&nbsp;<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&nbsp;</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>&nbsp;<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>&nbsp;<span style="font-size: 13px">流程:确定服务--&gt;编写Dockerfile制作镜像--&gt;上传镜像到仓库--&gt;编写K8S文件--&gt;创建</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文件&nbsp;cd /mysoft 下&nbsp;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">&nbsp;# 登录阿里云镜像仓库</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">&nbsp;<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">&nbsp;<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]&nbsp;&nbsp;</span></p>
<p><span style="font-size: 13px">  192.168.1.102&nbsp; 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">&lt;properties&gt;
      &lt;project.build.sourceEncoding&gt;UTF-<span style="color: rgba(128, 0, 128, 1)">8</span>&lt;/project.build.sourceEncoding&gt;
      &lt;project.reporting.outputEncoding&gt;UTF-<span style="color: rgba(128, 0, 128, 1)">8</span>&lt;/project.reporting.outputEncoding&gt;
      &lt;java.version&gt;<span style="color: rgba(128, 0, 128, 1)">1.8</span>&lt;/java.version&gt;
      &lt;spring-cloud.version&gt;Greenwich.SR1&lt;/spring-cloud.version&gt;
    &lt;/properties&gt;

    &lt;dependencies&gt;
      &lt;dependency&gt;
            &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
            &lt;artifactId&gt;spring-boot-starter-web&lt;/artifactId&gt;
            &lt;version&gt;<span style="color: rgba(128, 0, 128, 1)">2.1</span>.<span style="color: rgba(128, 0, 128, 1)">6</span>.RELEASE&lt;/version&gt;
      &lt;/dependency&gt;
      &lt;dependency&gt;
            &lt;groupId&gt;org.springframework.cloud&lt;/groupId&gt;
            &lt;artifactId&gt;spring-cloud-starter-alibaba-nacos-discovery&lt;/artifactId&gt;
      &lt;/dependency&gt;
      &lt;dependency&gt;
            &lt;groupId&gt;org.apache.httpcomponents&lt;/groupId&gt;
            &lt;artifactId&gt;httpclient&lt;/artifactId&gt;
            &lt;version&gt;<span style="color: rgba(128, 0, 128, 1)">4.5</span>.<span style="color: rgba(128, 0, 128, 1)">10</span>&lt;/version&gt;
      &lt;/dependency&gt;
    &lt;/dependencies&gt;

    &lt;dependencyManagement&gt;
      &lt;dependencies&gt;
            &lt;dependency&gt;
                &lt;!-- SpringCloud 所有子项目 版本集中管理. 统一所有SpringCloud依赖项目的版本依赖--&gt;
                &lt;groupId&gt;org.springframework.cloud&lt;/groupId&gt;
                &lt;artifactId&gt;spring-cloud-dependencies&lt;/artifactId&gt;
                &lt;version&gt;${spring-cloud.version}&lt;/version&gt;
                &lt;type&gt;pom&lt;/type&gt;
                &lt;scope&gt;import&lt;/scope&gt;
            &lt;/dependency&gt;
            &lt;dependency&gt;
                &lt;groupId&gt;org.springframework.cloud&lt;/groupId&gt;
                &lt;artifactId&gt;spring-cloud-alibaba-dependencies&lt;/artifactId&gt;
                &lt;version&gt;<span style="color: rgba(128, 0, 128, 1)">0.9</span>.<span style="color: rgba(128, 0, 128, 1)">0</span>.RELEASE&lt;/version&gt;
                &lt;type&gt;pom&lt;/type&gt;
                &lt;scope&gt;import&lt;/scope&gt;
            &lt;/dependency&gt;
      &lt;/dependencies&gt;
    &lt;/dependencyManagement&gt;
    &lt;build&gt;
      &lt;plugins&gt;
            &lt;plugin&gt;
                &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
                &lt;artifactId&gt;spring-boot-maven-plugin&lt;/artifactId&gt;
                &lt;version&gt;<span style="color: rgba(128, 0, 128, 1)">2.1</span>.<span style="color: rgba(128, 0, 128, 1)">6</span>.RELEASE&lt;/version&gt;
            &lt;/plugin&gt;
            &lt;plugin&gt;
                &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
                &lt;artifactId&gt;spring-boot-maven-plugin&lt;/artifactId&gt;
                &lt;version&gt;<span style="color: rgba(128, 0, 128, 1)">2.1</span>.<span style="color: rgba(128, 0, 128, 1)">6</span>.RELEASE&lt;/version&gt;
                &lt;executions&gt;
                  &lt;execution&gt;
                        &lt;goals&gt;
                            &lt;goal&gt;repackage&lt;/goal&gt;
                        &lt;/goals&gt;
                  &lt;/execution&gt;
                &lt;/executions&gt;
            &lt;/plugin&gt;
      &lt;/plugins&gt;
    &lt;/build&gt;</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>&lt;ServiceInstance&gt; 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">&nbsp;(2)&nbsp; 本地测试无误以后将两个项目打成 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) 编写&nbsp; 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&nbsp; 查看pods</span></p>
<p><span style="font-size: 13px">  kubectl get pods -o wide&nbsp; &nbsp;查看pods详情&nbsp;</span></p>
<p><span style="font-size: 13px">  kubectl get svc&nbsp; &nbsp;查看service</span></p>
<p><span style="font-size: 13px">  kubectl get ingress&nbsp; 查看ingress网络</span></p>
<p><img src="https://img2018.cnblogs.com/i-beta/1383365/201912/1383365-20191223155248932-2012319242.png"></p>
<p>&nbsp;  <span style="font-size: 13px">这个时候我通过:kubectl logs -f &lt;pod-name&gt;&nbsp; &nbsp;[主要是为了看日志输出,证明user能否访问order] 发现这个pod报错了,连接不上,经过测试&nbsp; 在本地跟直接在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">&nbsp;  这个时候我们可以&nbsp; docker exec -it&nbsp; &nbsp; containerId&nbsp; &nbsp;/bin/sh&nbsp; 进入对用容器&nbsp; 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">&nbsp;<img src="https://img2018.cnblogs.com/i-beta/1383365/201912/1383365-20191224105634786-1397189573.png"></span></p>
<p>&nbsp;<img src="https://img2018.cnblogs.com/i-beta/1383365/201912/1383365-20191224105646274-1052321044.png"></p>
<p>&nbsp;  可以发现,注册到nacos server上的服务ip地址为pod的ip,比如192.168.190.114/192.168.190.115 .</p>
<p>&nbsp;<img src="https://img2018.cnblogs.com/i-beta/1383365/201912/1383365-20191224105719431-1554163640.png"></p>
<p>&nbsp;(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>&nbsp;<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>&nbsp;  <span style="font-size: 13px">构建之前记得把之前哪个删掉:kubectl apply -f order.yaml&nbsp;</span></p>
<p><span style="font-size: 13px">&nbsp;  kubectl get pods -o wide ---&gt;找到pod运行在哪个机器上,比如w2,查看w2上的9090端口是否启动</span></p>
<p>&nbsp;  构建完,启动本地的user服务,看是否注册上去:</p>
<p>&nbsp;<img src="https://img2018.cnblogs.com/i-beta/1383365/201912/1383365-20191224112140183-683818141.png"></p>
<p>&nbsp;<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>&nbsp;</p>
<p>&nbsp;  查看控制台的输出信息:</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]
查看完整版本: Kubernetes服务部署案例实战