预备:
Minikube:https://github.com/kubernetes/minikube
kubectl:https://kubernetes.io/docs/tasks/tools/install-kubectl/
docker:https://docs.docker.com/toolbox/toolbox_install_mac/
1.使用SPOTIFY maven插件构建简单的Spring MVC控制器和Docker镜像:
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController;
/** * Created by tomask79 on 20.06.18. */ @RestController public class ControllerMVC {
@RequestMapping("/sayhello") public String mvcTest() { return "I'm saying hello to Kubernetes!"; } }
|
http://<hostIP>:8081/sayhello 会返回:"I'm saying hello to Kubernetes!"Docker 部分
[INFO] --- docker-maven-plugin:1.0.0:build (build-image) @ demo --- [INFO] Using authentication suppliers: [ConfigFileRegistryAuthSupplier] [INFO] Copying /Users/tomask79/Downloads/kubernetes-boot/target/demo-0.0.1-SNAPSHOT.jar -> /Users/tomask79/Downloads/kubernetes-boot/target/docker/demo-0.0.1-SNAPSHOT.jar [INFO] Building image test-controller:1.0-SNAPSHOT Step 1/3 : FROM openjdk:latest
---> a2fbe0dde8c0 Step 2/3 : ADD /demo-0.0.1-SNAPSHOT.jar //
---> f6d0ea73d221 Step 3/3 : ENTRYPOINT ["java", "-jar", "/demo-0.0.1-SNAPSHOT.jar"]
---> Running in ef86f44eb22c Removing intermediate container ef86f44eb22c ---> f9079973efda ProgressMessage{id=null, status=null, stream=null, error=null, progress=null, progressDetail=null} Successfully built f9079973efda Successfully tagged test-controller:1.0-SNAPSHOT
|
如果要更改镜像名称和其他属性,请更改maven docker插件属性:
<plugin> <executions> <execution> <id>build-image</id> <phase>package</phase> <goals> <goal>build</goal> </goals> </execution> </executions> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <version>1.0.0</version> <configuration> <imageName>test-controller:1.0-SNAPSHOT</imageName> <baseImage>openjdk:latest</baseImage> <entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]</entryPoint> <resources> <resource> <targetPath>/</targetPath> <directory>${project.build.directory}</directory> <include>${project.build.finalName}.jar</include> </resource> </resources> </configuration> </plugin>
|
现在运行docker镜像。您应该看到kubernetes集群组件的镜像,包括我们的测试控制器:1.0-SNAPSHOT :
$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE test-controller 1.0-SNAPSHOT f59ad695afd9 About an hour ago 640MB openjdk latest a2fbe0dde8c0 2 weeks ago 624MB k8s.gcr.io/kube-proxy-amd64 v1.10.0 bfc21aadc7d3 2 months ago 97MB k8s.gcr.io/kube-apiserver-amd64 v1.10.0 af20925d51a3 2 months ago 225MB k8s.gcr.io/kube-controller-manager-amd64 v1.10.0 ad86dbed1555 2 months ago 148MB k8s.gcr.io/kube-scheduler-amd64 v1.10.0 704ba848e69a 2 months ago 50.4MB k8s.gcr.io/etcd-amd64 3.1.12 52920ad46f5b 3 months ago 193MB k8s.gcr.io/kube-addon-manager v8.6 9c16409588eb 4 months ago 78.4MB k8s.gcr.io/k8s-dns-dnsmasq-nanny-amd64 1.14.8 c2ce1ffb51ed 5 months ago 41MB k8s.gcr.io/k8s-dns-sidecar-amd64 1.14.8 6f7f2dc7fab5 5 months ago 42.2MB k8s.gcr.io/k8s-dns-kube-dns-amd64 1.14.8 80cc5ea4b547 5 months ago 50.5MB k8s.gcr.io/pause-amd64 3.1 da86e6ba6ca1 6 months ago 742kB k8s.gcr.io/kubernetes-dashboard-amd64 v1.8.1 e94d2f21bc0c 6 months ago 121MB gcr.io/k8s-minikube/storage-provisioner v1.8.1 4689081edb10 7 months ago 80.8MB k8s.gcr.io/echoserver 1.4
|
Kubernetes 部分:
- 建议通过“minikube start”启动minikube
- 通过kubectl cluster-info验证minikube本地kubernetes集群是否已启动
$ kubectl cluster-info Kubernetes master is running at https://192.168.99.100:8443 KubeDNS is running at https://192.168.99.100:8443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
|
是时候将应用程序部署到kubernetes了。在开始之前,我建议您熟悉这些条款。从这里开始,例如:https://kubernetes.io/docs/concepts/
关注条款:
- Kubernetes POD
- Kubernetes部署
- Kubernetes服务(Type NodePort)
在pom.xml的根目录下运行“kubectl create -f deployment.yaml”
deployment.yaml:apiVersion: extensions/v1beta1 kind: Deployment metadata: name: test-app spec: replicas: 1 template: metadata: labels: app: test-app spec: containers: - name: test-app image: test-controller:1.0-SNAPSHOT ports: - containerPort: 8081
|
并验证是否已安装部署且POD正在运行。
$ kubectl get pods NAME READY STATUS RESTARTS AGE hello-minikube-6c47c66d8-gzvgc 1/1 Running 4 5d test-app-64f8b5bfcd-vndtn 1/1 Running 0 2h
|
验证复制节点的DEPLOYMENT也是运行的:
$ kubectl get deployments NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE hello-minikube 1 1 1 1 5d test-app 1 1 1 1 2h
|
要从外部访问DEPLOYMENT测试应用程序,我们需要为此安装kubernetes服务。我将使用NODEPORT类型,随机分配的端口范围为30000-32767。
service.yaml ...
apiVersion: v1 kind: Service metadata: name: test-app labels: name: test-app spec: type: NodePort ports: - port: 8081 targetPort: 8081 selector: app: test-app
|
安装服务运行"kubectl create -f service.yaml",验证确认:
$ kubectl get services NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 5d test-app NodePort 10.107.38.160 <none>
|
从外部访问部署
需要获取服务的URL,我们有两个选择:
1)minikube service test-app --url
$ minikube service test-app --url http://192.168.99.100:31201
|
2) kubectl describe service test-app ...
$ kubectl describe service test-app Name: test-app Namespace: default Labels: name=test-app Annotations: none Selector: app=test-app Type: NodePort IP: 10.107.38.160 Port: unset 8081/TCP TargetPort: 8081/TCP NodePort: unset 31201/TCP Endpoints: 172.17.0.5:8081 Session Affinity: None External Traffic Policy: Cluster Events: none
|
我们知道master运行在192.168.99.100,分配端口是31201.所以让我们测试一下:
$ curl http://192.168.99.100:31201/sayhello I'm saying hello to Kubernetes!
|
好的,我们已成功将spring-boot应用程序部署到kubernetes ...我希望你喜欢它。
点击标题见原文