最新最全详细 在centos上使用 Minikube 安装 Kubernetes 教程,在安装完k8s单机集群后并运行一个nginx服务 和一个go 的http hello server 服务
本文已更新到 Minikube v1.11.0/Kubernetes v1.18+
什么是Minikube?
参考官方文档:
https://kubernetes.io/zh/docs/tasks/tools/install-minikube/
pis:
- 官方的在国内不怎么好使,使用都是google源,大部分被墙了,下面安装都是使用国内的源进行安装。
- 安装k8s对机器硬件系统有一定要求,2G 2核 20G好像是最低要求,小于这个配置会提示你安装不了k8s集群。具体看官方配置要求。
注意: 本文安装教程是基于centos系统的。安装之前可以把yum源更换为国内阿里源,然后可以yum date一下
一、安装安装 kubectl
kubectl是Kubernetes集群的命令行工具,用来操作集群的。
在 Kubernetes 上使用 Kubernetes 命令行工具 kubectl 部署和管理应用程序。使用 kubectl,您可以检查集群资源;创建、删除和更新组件;查看您的新集群;并启动实例应用程序。
官方参考:https://kubernetes.io/zh/docs/tasks/tools/install-kubectl/
国内安装快速安装kubectl
参考:https://www.jianshu.com/p/b58c85436f0a
配置k8s的kubelet yum源
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
yum安装kubectl:
# 安装
yum install -y kubectl kubelet kubeadm
# 开机启动
systemctl enable kubelet
# 启动
systemctl start kubelet
查看版本 kubectl version
我这安装的是1.18.3版本
[root@localhost k8s]# kubectl version
Client Version: version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.3", GitCommit:"2e7996e3e2712684bc73f0dec0200d64eec7fe40", GitTreeState:"clean", BuildDate:"2020-05-20T12:52:00Z", GoVersion:"go1.13.9", Compiler:"gc", Platform:"linux/amd64"}
The connection to the server localhost:8080 was refused - did you specify the right host or port?
二、先把docker安装上吧
在安装Minikube 之前把docker安装好吧,如果docker版本比较则最好更新好最新的版本免得后面要安装出现问题。
参考:https://www.runoob.com/docker/centos-docker-install.html
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
更改docker镜像源
vim /etc/docker/daemon.json #没有则创建daemon.json文件
{
"registry-mirrors":["你个人的加速器地址"]
}
#加速地址自行搜索阿里云docker配置
我的:
root@localhost k8s]# vim /etc/docker/daemon.json
[root@localhost k8s]# cat /etc/docker/daemon.json
{
"registry-mirrors":["https://qdsf52uj.mirror.aliyuncs.com"]
}
重启docker
systemctl daemon-reload
systemctl restart docker
三、安装 Minikube
minikube
阿里云发布的minikube
github地址:https://github.com/AliyunContainerService/minikube
curl -Lo minikube https://kubernetes.oss-cn-hangzhou.aliyuncs.com/minikube/releases/v1.11.0/minikube-linux-amd64 && chmod +x minikube && sudo mv minikube /usr/local/bin/
启动单机集群
我使用–driver=none模式
minikube start --driver=none
第一次需要一点时间下载,耐心等待吧…
[root@localhost k8s]# minikube start --driver=none
😄 minikube v1.11.0 on Centos 7.8.2003
✨ Using the none driver based on user configuration
👍 Starting control plane node minikube in cluster minikube
🤹 Running on localhost (CPUs=2, Memory=1819MB, Disk=17394MB) ...
ℹ️ OS release is CentOS Linux 7 (Core)
🐳 Preparing Kubernetes v1.18.3 on Docker 19.03.11 ...
> kubeadm.sha256: 65 B / 65 B [--------------------------] 100.00% ? p/s 0s
> kubelet.sha256: 65 B / 65 B [--------------------------] 100.00% ? p/s 0s
> kubectl.sha256: 65 B / 65 B [--------------------------] 100.00% ? p/s 0s
> kubeadm: 37.97 MiB / 37.97 MiB [------------] 100.00% 1011.17 KiB p/s 38s
> kubectl: 41.99 MiB / 41.99 MiB [-------------] 100.00% 894.57 KiB p/s 48s
> kubelet: 10.71 MiB / 108.04 MiB [>______] 9.91% 26.82 KiB p/s ETA 1h1m56s
出现错误:
/proc/sys/net/bridge/bridge-nf-call-iptables contents are not set to 1
解决方法:
[root@localhost k8s]# swapoff -a
[root@localhost k8s]# echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables
看到下面信息就表示成功启动k8s单机集群了
[root@localhost k8s]# minikube start --driver=none
😄 minikube v1.11.0 on Centos 7.8.2003
✨ Using the none driver based on user configuration
👍 Starting control plane node minikube in cluster minikube
🤹 Running on localhost (CPUs=2, Memory=1819MB, Disk=17394MB) ...
ℹ️ OS release is CentOS Linux 7 (Core)
🐳 Preparing Kubernetes v1.18.3 on Docker 19.03.11 ...
🤹 Configuring local host environment ...
❗ The 'none' driver is designed for experts who need to integrate with an existing VM
💡 Most users should use the newer 'docker' driver instead, which does not require root!
📘 For more information, see: https://minikube.sigs.k8s.io/docs/reference/drivers/none/
❗ kubectl and minikube configuration will be stored in /root
❗ To use kubectl or minikube commands as your own user, you may need to relocate them. For example, to overwrite your own settings, run:
▪ sudo mv /root/.kube /root/.minikube $HOME
▪ sudo chown -R $USER $HOME/.kube $HOME/.minikube
💡 This can also be done automatically by setting the env var CHANGE_MINIKUBE_NONE_USER=true
🔎 Verifying Kubernetes components...
🌟 Enabled addons: default-storageclass, storage-provisioner
🏄 Done! kubectl is now configured to use "minikube"
打开Kubernetes控制台
minikube dashboard
如果出现错误多执行几次minikube dashboard: 因为可能是容器没完全拉下来
kubectl get pod --all-namespaces 查看是否全部拉下没有 READY 状态 1/1表完成 我下面0/1表示没拉下。执行minikube dashboard直到都完全拉下来
kubectl get pod --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-546565776c-lb46j 0/1 Running 0 17m
kube-system coredns-546565776c-sxfkw 0/1 Running 0 17m
kube-system etcd-localhost.localdomain 1/1 Running 0 17m
kube-system kube-apiserver-localhost.localdomain 1/1 Running 0 17m
kube-system kube-controller-manager-localhost.localdomain 1/1 Running 0 17m
kube-system kube-proxy-467j8 1/1 Running 0 17m
kube-system kube-scheduler-localhost.localdomain 1/1 Running 0 17m
kube-system storage-provisioner 1/1 Running 0 17m
kubernetes-dashboard dashboard-metrics-scraper-84bfdf55ff-hdjhn 1/1 Running 0 13m
kubernetes-dashboard kubernetes-dashboard-696dbcc666-tzzls 0/1 CrashLoopBackOff 7 13m
再次kubectl get pod --all-namespaces
[root@localhost ~]# kubectl get pod --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-546565776c-lb46j 1/1 Running 0 25m
kube-system coredns-546565776c-sxfkw 1/1 Running 0 25m
kube-system etcd-localhost.localdomain 1/1 Running 0 25m
kube-system kube-apiserver-localhost.localdomain 1/1 Running 0 25m
kube-system kube-controller-manager-localhost.localdomain 1/1 Running 0 25m
kube-system kube-proxy-467j8 1/1 Running 0 25m
kube-system kube-scheduler-localhost.localdomain 1/1 Running 0 25m
kube-system storage-provisioner 1/1 Running 0 25m
kubernetes-dashboard dashboard-metrics-scraper-84bfdf55ff-hdjhn 1/1 Running 0 21m
kubernetes-dashboard kubernetes-dashboard-696dbcc666-tzzls 0/1 CrashLoopBackOff 8 21m
出现下面的信息表示完全启动dashboard
minikube dashboard
🤔 Verifying dashboard health ...
🚀 Launching proxy ...
🤔 Verifying proxy health ...
http://127.0.0.1:39798/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/
通过apiserver访问
对外暴露地址:
nohup kubectl proxy --port=8088 --address=‘192.168.1.128’ --accept-hosts=’^.*’ >/dev/null 2>&1 &
然后就可以在浏览器上访问了:
http://192.168.1.128:8088/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/
- 完成安装之后,我们就可以发布,更新,回滚自己的程序。这个时候我们就需要了解Pod、ReplicaSet、Deployment、Service相关的概念。
使用k8s运行服务
1、运行nginx服务
创建第一个Deployment
- 了解到只需要创建好Deployment就会自动完成ReplicaSet和pod。下面就创建一个Nginx的Deployment。
nginx-deployment.yaml文件内容
apiVersion: apps/v1 # for versions before 1.16.0 use extensions/v1beta1
kind: Deployment
metadata:
name: nginx-deployment # deployment的名称
spec:
selector:
matchLabels:
app: nginx # 选择器必须匹配 template中的metadata.labels
replicas: 3 # tells deployment to run 3 pods matching the template
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.16.0
ports:
- containerPort: 80
创建deployment
kubectl create -f ./nginx-deployment.yaml --record
[root@localhost k8s]# kubectl create -f ./nginx-deployment.yaml --record
deployment.apps/nginx-deployment created
kubectl get deployments 查看
[root@localhost k8s]# kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 3/3 3 3 62s
- NAME 列出群集中的部署名称。
- DESIRED 显示应用程序的所需副本数,您在创建部署时定义这些副本。这是理想的状态。
- CURRENT 显示当前正在运行的副本数量。
- UP-TO-DATE 显示已更新以实现所需状态的副本数。
- AVAILABLE 显示用户可以使用的应用程序副本数。
- AGE 显示应用程序运行的时间。
我们为刚才的nginx-deployment创建服务对象:
Service
一种抽象的方式暴露在一组运行的应用程序Pods作为网络服务。
使用Kubernetes,您无需修改应用程序即可使用不熟悉的服务发现机制。Kubernetes为Pods提供了自己的IP地址和一组Pod的单个DNS名称,并且可以在它们之间进行负载均衡。
nginx-service.yaml 文件内容
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
type: NodePort # 为POD开放端口
ports:
- protocol: TCP
port: 80
nodePort: 30000 # 30000流量转到80端口
执行kubectl apply -f nginx-service.yaml来创建Service
[root@localhost k8s]# kubectl apply -f nginx-service.yaml
service/nginx-service created
如果你使用的是minikube, 你通过minikube service nginx-service --url来获取访问入口
[root@localhost k8s]# minikube service nginx-service --url
http://192.168.1.128:30000
可以通过kubctl名来设置访问的url
kubectl port-forward nginx-deployment-7d9d7464fb-mrc4h 30001:80
[root@localhost k8s]# kubectl port-forward nginx-deployment-9664d7db6-jfwvv 30001:80
Forwarding from 127.0.0.1:30001 -> 80
Forwarding from [::1]:30001 -> 80
- ubectl port-forward需要的是pod名称, 你可以通过kubectl get pods得到名称.
[root@localhost k8s]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-deployment-9664d7db6-jfwvv 1/1 Running 0 10m
nginx-deployment-9664d7db6-p9zhh 1/1 Running 0 10m
nginx-deployment-9664d7db6-wgxg7 1/1 Running 0 10m
2、运行自己的go http web服务
- 创建自己的web服务
- 创建服务的docker镜像,需要些dockerfile文件
- 部署服务到k8s
创建自己的web服务
server.go 文件
package main
import (
"net/http"
"log"
"io"
)
func hello(w http.ResponseWriter,r *http.Request) {
io.WriteString(w,"hello, kubetnetes!\n")
}
func main() {
http.HandleFunc("/hello",hello)
err := http.ListenAndServe(":7070",nil)
if err != nil {
log.Panic(err)
}
}
编译之后可以运行起来。
[root@localhost src]# go build -o server server.go
[root@localhost src]# ./server
新开一个窗口进行curl,可以看到输出了hello, kubetnetes!
[root@localhost ~]# curl 192.168.42.131:7070/hello
hello, kubetnetes!
创建服务docker镜像
编写Dockerfile
# Use the official Golang image to create a build artifact.
# https://hub.docker.com/_/golang
FROM golang:latest as builder
# Copy local code to the container image.
WORKDIR /root/k8s/godockerfile
COPY . .
RUN GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -o app http_server.go
# Use a Docker multi-stage build to create a lean production image.
# https://docs.docker.com/develop/develop-images/multistage-build/#use-multi-stage-builds
FROM alpine:latest
COPY --from=builder /root/k8s/godockerfile .
ENV PORT 7070
# Run the web service on container startup.
CMD ["./app"]
打包镜像: docker build -t http_server.go:v1 .
[root@localhost dockerfile]# docker build -t server:v1 .
Sending build context to Docker daemon 3.584kB
Step 1/8 : FROM golang:latest as builder
---> 5fbd6463d24b
Step 2/8 : WORKDIR /root/k8s/godockerfile
---> Using cache
---> e493573ef164
Step 3/8 : COPY . .
---> 885e68693538
Step 4/8 : RUN GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -o app http_server.go
---> Running in 24a7027bdee3
Removing intermediate container 24a7027bdee3
---> c58ebb1735c1
Step 5/8 : FROM alpine:latest
latest: Pulling from library/alpine
df20fa9351a1: Pull complete
Digest: sha256:185518070891758909c9f839cf4ca393ee977ac378609f700f60a771a2dfe321
Status: Downloaded newer image for alpine:latest
---> a24bb4013296
Step 6/8 : COPY --from=builder /root/k8s/godockerfile .
---> fc2c74b4c794
Step 7/8 : ENV PORT 7070
---> Running in 3b0dbbf02eea
Removing intermediate container 3b0dbbf02eea
---> c13bb216b91f
Step 8/8 : CMD ["./app"]
---> Running in a74c69d28545
Removing intermediate container a74c69d28545
---> 76bf3e25da25
Successfully built 76bf3e25da25
Successfully tagged server:v1
部署server到k8s
docker iamges 查看镜像名
[root@localhost dockerfile]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
server v1 76bf3e25da25 3 minutes ago 13MB
使用 yaml 文件
touch hello-kubernetes.yaml
apiVersion: v1
kind: Service
metadata:
name: hello-kubernetes
spec:
selector:
app: hello-kubernetes
type: NodePort # 为POD开放端口
ports:
- protocol: TCP
port: 7070
nodePort: 30001 # 30000流量转到80端口
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: hello-kubernetes
spec:
replicas: 1
selector:
matchLabels:
app: hello-kubernetes
template:
metadata:
labels:
app: hello-kubernetes
spec:
containers:
- name: hello-kubernetes
image: server:v1
imagePullPolicy: Never
ports:
- containerPort: 7070
执行部署
kubectl apply -f hello-kubernetes.yaml
root@localhost dockerfile]# kubectl apply -f hello-kubernetes.yaml
service/hello-kubernetes created
deployment.apps/hello-kubernetes created
kubectl get po 查看一下
[root@localhost dockerfile]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
hello-kubernetes NodePort 10.110.213.111 <none> 7070:30001/TCP 55s
kubectl get svc 查看一下
[root@localhost dockerfile]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
hello-kubernetes NodePort 10.110.213.111 <none> 7070:30001/TCP 94s
查看一下url
[root@localhost dockerfile]# minikube service hello-kubernetes --url
http://192.168.1.128:30001
curl或者在浏览器中访问:
[root@localhost dockerfile]# curl http://192.168.1.128:30001/hello
hello, kubetnetes!
删除部署
$ kubectl delete -f hello-kubernetes.yaml
参考文章:
- Minikube安装成功Kubernetes,一次过!
- https://yq.aliyun.com/articles/221687
- https://loocode.com/post/10174