一. mac安装K8S
1.brew安装
brew install kubectl
2.查看版本
kubectl version --output=json
{
"clientVersion": {
"major": "1",
"minor": "27",
"gitVersion": "v1.27.2",
"gitCommit": "7f6f68fdabc4df88cfea2dcf9a19b2b830f1e647",
"gitTreeState": "clean",
"buildDate": "2023-05-17T14:13:27Z",
"goVersion": "go1.20.4",
"compiler": "gc",
"platform": "darwin/amd64"
},
"kustomizeVersion": "v5.0.1"
}
The connection to the server 127.0.0.1:6443 was refused - did you specify the right host or port?
还没有在本地运行k8s集群
二. 安装minikube
2.1 brew install安装minikube
brew install minikube
2.2 minikube开启k8s
minikube start
2.3 kubectl命令查看相关信息
kubectl cluster-info
查看pods
kubectl get po -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-787d4945fb-97qlx 1/1 Running 0 13m
kube-system etcd-minikube 1/1 Running 0 13m
kube-system kube-apiserver-minikube 1/1 Running 0 13m
kube-system kube-controller-manager-minikube 1/1 Running 0 13m
kube-system kube-proxy-kvcj7 1/1 Running 0 13m
kube-system kube-scheduler-minikube 1/1 Running 0 13m
kube-system storage-provisioner 1/1 Running 1 (13m ago) 13m
查看node信息
kubectl get nodes
NAME STATUS ROLES AGE VERSION
minikube Ready control-plane 16m v1.26.3
2.4 开启dashboard
minikube dashboard
三. minikube常用命令
Pause Kubernetes without impacting deployed applications:
minikube pause
Unpause a paused instance:
minikube unpause
Halt the cluster:
minikube stop
Change the default memory limit (requires a restart):
minikube config set memory 9001
Browse the catalog of easily installed Kubernetes services:
minikube addons list
Create a second cluster running an older Kubernetes release:
minikube start -p aged --kubernetes-version=v1.16.1
Delete all of the minikube clusters:
minikube delete --all
四. 通过deployment部署pod
4.1 查看创建namespace
kubectl create namespace dev
kubectl get namespaces
#显示如下
NAME STATUS AGE
dev Active 2s
4.2 配置yaml文件
# deploy-mydemo.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-golang-app-demo
namespace: dev
spec:
replicas: 2
selector:
matchLabels:
app: my-golang-app-demo
template:
metadata:
labels:
app: my-golang-app-demo
spec:
containers:
- image: my-golang-app:latest
name: my-golang-app-demo
ports:
- name: port1
containerPort: 8991
protocol: TCP
- name: port2
containerPort: 8992
protocol: TCP
4.3 创建deployment
kubectl apply -f deploy-mydemo.yaml
查看pod启动情况
kubectl -n dev get pods
在k8s
中,大部分的问题,都能通过logs
和describe
两个命令进行分析和定位
发现并没有启动起来,查看日志镜像没有拉取成功
kubectl -n dev logs my-golang-app-demo-869787c5dc-fzjrn
Error from server (BadRequest): container "my-golang-app-demo" in pod "my-golang-app-demo-869787c5dc-fzjrn" is waiting to start: trying and failing to pull image
原因是k8s默认去仓库拉取镜像,我没有上传镜像,上传镜像到docker hub中后,再次启动成功运行pod
这里记录一个删除deployment的命令
kubectl delete deployment my-golang-app-demo -n dev
可以看到运行起来了
查看deployment状态
kubectl get deployment -n dev my-golang-app-demo -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
my-golang-app-demo 2/2 2 2 9m23s my-golang-app-demo my-golang-app:latest app=my-golang-app-demo
查看pods状态
kubectl get pods -n dev -l app=my-golang-app-demo -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
my-golang-app-demo-6ddc9c96d-m6qqg 1/1 Running 0 11m 10.244.0.17 minikube <none> <none>
my-golang-app-demo-6ddc9c96d-n525c 1/1 Running 0 11m 10.244.0.16 minikube <none> <none>
进入pod,请求接口看到正常返回,pod间已经打通
kubectl -n dev exec -it my-golang-app-demo-6ddc9c96d-m6qqg -- /bin/bash
curl -L localhost:8992/sayHello
"hello1"
curl -L 10.244.0.16:8991/sayHello
"hello"
curl -L 10.244.0.17:8991/sayHello
"hello"
4.4 创建service
显然,光有pod是不够的,我们还需要一个类似传统部署方案中的Nginx那样的入口,同时肩负起负载均衡和服务暴露的功能。在K8s集群中,我们通过Service实例实现这个需求。
在service的配置文件中,通过selector选择了带有app: my-golang-app-demo标签的pod作为自己的后端服务,并且完成了8991:8991,8992:8992的端口映射
# service-mydemo-NodePort.yaml
apiVersion: v1
kind: Service
metadata:
name: svc-my-demo
namespace: dev
labels:
app: my-golang-app-demo
spec:
selector:
app: my-golang-app-demo
ports:
- protocol: TCP
port: 8991
targetPort: 8991
name: svr-port1
- protocol: TCP
port: 8992
targetPort: 8992
name: svr-port2
type: NodePort
查看service状态
kubectl get service -n dev
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
svc-my-demo NodePort 10.111.0.15 <none> 8991:30608/TCP,8992:32366/TCP 34s
查看minikube service list
minikube service list
|----------------------|---------------------------|----------------|-----|
| NAMESPACE | NAME | TARGET PORT | URL |
|----------------------|---------------------------|----------------|-----|
| default | kubernetes | No node port | |
| dev | svc-my-demo | svr-port1/8991 | |
| | | svr-port2/8992 | |
| kube-system | kube-dns | No node port | |
| kubernetes-dashboard | dashboard-metrics-scraper | No node port | |
| kubernetes-dashboard | kubernetes-dashboard | No node port | |
|----------------------|---------------------------|----------------|-----|
其中url没有值
获取nodes信息
kubectl get nodes
NAME STATUS ROLES AGE VERSION
minikube Ready control-plane 10d v1.26.3
获取minikube信息,可以看到minikube 这个node 的ip,然后用这个ip访问不到
kubectl describe node minikube
好像只有run起来才能访问,并且映射到本地的其他端口
minikube service svc-my-demo -n dev
|-----------|-------------|----------------|---------------------------|
| NAMESPACE | NAME | TARGET PORT | URL |
|-----------|-------------|----------------|---------------------------|
| dev | svc-my-demo | svr-port1/8991 | http://192.168.49.2:31968 |
| | | svr-port2/8992 | http://192.168.49.2:31107 |
|-----------|-------------|----------------|---------------------------|
🏃 Starting tunnel for service svc-my-demo.
|-----------|-------------|-------------|------------------------|
| NAMESPACE | NAME | TARGET PORT | URL |
|-----------|-------------|-------------|------------------------|
| dev | svc-my-demo | | http://127.0.0.1:65442 |
| | | | http://127.0.0.1:65443 |
|-----------|-------------|-------------|------------------------|
[dev svc-my-demo http://127.0.0.1:65442
http://127.0.0.1:65443]
❗ Because you are using a Docker driver on darwin, the terminal needs to be open to run it.
执行上面的命令可以看到其实运行起了一个进程,这个时候用http://127.0.0.1:65442可以访问成功
curl -L http://127.0.0.1:65442/sayHello
"hello"%
curl -L http://127.0.0.1:65443/sayHello
"hello1"%
小白不太清楚具体原因,可能是mac环境的特殊问题。不过已经可以访问k8s中的接口了。
PS:
参考bug
services running on minikube cluster are inaccessible · Issue #13788 · kubernetes/minikube · GitHub