前言
最近开始学习Kubernetes,再次记录一些自己学习的一些心得,与大家分享,互相交流,共同进步。
纯小白一个,欢迎大家批评指正,欢迎评论,谢谢 ~~~
准备
- Ubuntu 18.04 Server LTS (或者 Centos)
- 暂时不支持Ubuntu 20.04 Server LTS
- Firefox浏览器
Kubeasz
致力于提供快速部署高可用k8s集群的工具, 同时也努力成为k8s实践、使用的参考书。
相比于minikube在国内网络环境下更加友好。
可以非常便捷的部署一套用于自学的k8s环境。
开始
以下内容为Kubeasz AllinOne 文档 AllinOne部署
1. 下载文件
- 下载工具脚本
export release=2.2.1
curl -C- -fLO --retry 3 https://github.com/easzlab/kubeasz/releases/download/${release}/easzup
chmod +x ./easzup
- 使用工具脚本安装k8s以及docker
./easzup -D -d 19.03.5 -k v1.18.2
- 下载离线系统包
./easzup -P
上述脚本执行成功以后,所有所需文件均放入目录 /etc/ansible中
2. 安装集群
- 容器化启动kubeasz
./easzup -S
- 使用默认配置允许 AllinOne 集群
docker exec -it kubeasz easzctl start-aio
3. 验证安装
这里如果提示kubectl: command not found,你可以退出机器重新ssh,或者切换到root权限即可。
$ kubectl version # 验证集群版本
$ kubectl get node # 验证节点就绪 (Ready) 状态
$ kubectl get pod -A # 验证集群pod状态,默认已安装网络插件、coredns、metrics-server等
$ kubectl get svc -A # 验证集群服务状态
4. Dashboard
$ kubectl get svc -A
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
default kubernetes ClusterIP 10.68.0.1 <none> 443/TCP 8h
kube-system dashboard-metrics-scraper ClusterIP 10.68.117.166 <none> 8000/TCP 15m
kube-system kube-dns ClusterIP 10.68.0.2 <none> 53/UDP,53/TCP,9153/TCP 8h
kube-system kubernetes-dashboard NodePort 10.68.98.36 <none> 443:30001/TCP 15m
kube-system metrics-server ClusterIP 10.68.176.123 <none> 443/TCP 8h
可以看到Dashboard 暴露在30001端口下
使用Firefox浏览器 访问对应IP的30001端口 https://xx.xx.xx.xx:30001
注: 这里为啥不用Chrome或者其他嘞?
因为Dashboard的证书原因,Chrome会显示不是私密连接,并且完全没有办法进入Dashboard,而Firefox就可以跳过。
使用Token登录Dashboard
# 创建Service Account 和 ClusterRoleBinding
$ kubectl apply -f /etc/ansible/manifests/dashboard/admin-user-sa-rbac.yaml
# 获取 Bearer Token,找到输出中 ‘token:’ 开头那一行
$ kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}')
k8s部署Go语言服务
下面使用kubeasz提供的实例,使用k8s部署Go应用
1. hello.go (github.com/easzlab/kub…)
package main
import (
"fmt"
"log"
"math/rand"
"net/http"
"time"
)
var appVersion = "1.2" //Default/fallback version
var instanceNum int
func getFrontpage(w http.ResponseWriter, r *http.Request) {
t := time.Now()
fmt.Fprintf(w, "Hello, Go! I'm instance %d running version %s at %s\n", instanceNum, appVersion, t.Format("2019-01-02 15:04:05"))
}
func health(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusOK)
}
func getVersion(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "%s\n", appVersion)
}
func main() {
rand.Seed(time.Now().UTC().UnixNano())
instanceNum = rand.Intn(1000)
http.HandleFunc("/", getFrontpage)
http.HandleFunc("/health", health)
http.HandleFunc("/version", getVersion)
log.Fatal(http.ListenAndServe(":3000", nil))
}
2. Dockerfile
FROM golang:latest as builder
COPY *.go /app/
RUN cd /app && go build -o hellogo .
# stage 2: use alpine as base image
FROM golang:latest
COPY --from=builder /app/hellogo /hellogo
CMD ["/hellogo"]
3. 容器化hellogo.go
# 构建容器
docker build -t hellogo:v1.0 .
# 容器化运行hellogo服务
docker run -d --name hello -p3000:3000 hellogo:v1.0
# 测试
curl localhost:3000
Hello, Go! I'm instance 814 running version 1.2 at 21069-06-21 14:22:52
到此我们已经容器化了我们的Go Web程序,接下来使用k8s部署。
4. hellogo.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: hellogo-deploy
spec:
replicas: 3
minReadySeconds: 5 # Wait 5 seconds after each new pod comes up before marked as "ready"
strategy:
type: RollingUpdate # describe how we do rolling updates
rollingUpdate:
maxUnavailable: 1 # When updating take one pod down at a time
maxSurge: 1
selector:
matchLabels:
name: hellogo-app
template:
metadata:
labels:
name: hellogo-app
spec:
containers:
- name: hellogo
image: hellogo:v1.0
imagePullPolicy: IfNotPresent
resources:
requests:
memory: "32Mi"
cpu: "50m"
limits:
memory: "64Mi"
cpu: "100m"
ports:
- containerPort: 3000
---
apiVersion: v1
kind: Service
metadata:
name: hellogo-svc
spec:
type: NodePort
ports:
- name: http
port: 80
targetPort: 3000
nodePort: 30002
selector:
name: hellogo-app
5. k8s部署
部署3个节点的hellogo服务
# 部署
$ kubectl apply -f hellogo.yaml
# 验证
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
hellogo-deploy-646655bbf5-6nzdn 1/1 Running 8 17m
hellogo-deploy-646655bbf5-cjbvx 1/1 Running 8 17m
hellogo-deploy-646655bbf5-pkbxq 1/1 Running 8 17m
$kubectl get deploy
NAME READY UP-TO-DATE AVAILABLE AGE
hellogo-deploy 3/3 3 3 20m
$kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
hellogo-svc NodePort 10.68.199.96 <none> 80:30002/TCP 21m
验证
root@ubuntu:/home/chen/hellogo# curl http://172.16.220.129:30002
Hello, Go! I'm instance 449 running version 1.2 at 21069-06-21 14:32:01
root@ubuntu:/home/chen/hellogo# curl http://172.16.220.129:30002
Hello, Go! I'm instance 867 running version 1.2 at 21069-06-21 14:32:02
root@ubuntu:/home/chen/hellogo# curl http://172.16.220.129:30002
Hello, Go! I'm instance 409 running version 1.2 at 21069-06-21 14:32:03
有3个不同id的服务返回了请求,说明部署正常。
结语
这次通过Kubeasz,我们简单的了解了k8s的基础操作,简单的体验了一下k8s的基本操作,随着学习的不断深入,未来我还会给大家分享一些自己学习k8s的经验与体会。
谢谢~~~