从一个简单的helloworld到charts
1.编写一个简单的helloworld
1.编写helloworld的web app
创建spring项目,修改配置文件application.yaml将程序注册端口8000
server:
port: 8000
创建HelloWorldController,添加http的get事件
@GetMapping("")
public String helloWorld(){
return "Hello World!";
}
2.创建健康检测liveness
@GetMapping("/healthz")
public String healthz(){
return "healthy!";
}
kubernetes中有两个heath-check机制,一是进程级的,通过容器对应用的检测完成,弊端是不能反馈应用是否可用;二是应用级的,有三种方式(httpGet、exec、TCPSocket)完成,本例使用且常用httpGet方式完成。
注:监控检测通常由liveness和readiness共同完成,本例较简单且单一,仅实现 liveness。
参考:https://my.oschina.net/u/3779583/blog/1806465
2.将应用打包成docker镜像
1.使用maven命令将项目打包成jar,并上传到linux上
mvn clean package
2.将hello-world-0.0.1-SNAPSHOT.jar同目录下创建Dockerfile文件
touch Dockerfile
3.Dockerfile添加以下内容
FROM java:8
VOLUME ./tmp
ADD hello-world-0.0.1-SNAPSHOT.jar /app.jar
EXPOSE 8761
ENTRYPOINT["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
4.使用docker build -t test/hello-world:0.0.1 .创建镜像
注:docker build 命令最后需加 .
5.使用 docker run -d -p 8000:8000 test/hello-world:0.0.1运行镜像
6.通过http://外网IP:8000(端口 )访问成功访问
3.将镜像发布到harbor私有仓库中
1.Docker-compose 安装
1、下载指定版本的docker-compose
$ curl -L https://github.com/docker/compose/releases/download/1.13.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
2、对二进制文件赋可执行权限
$ sudo chmod +x /usr/local/bin/docker-compose
3、测试下docker-compose是否安装成功
$ docker-compose --version
docker-compose version 1.13.0, build 1719ceb
2.Harbor服务搭建
1.下载安装harbor
1、在线安装包
$ wget https://github.com/vmware/harbor/releases/download/v1.1.2/harbor-online-installer-v1.1.2.tgz
$ tar xvf harbor-online-installer-v1.1.2.tgz
2、离线安装包
$ wget https://github.com/vmware/harbor/releases/download/v1.1.2/harbor-offline-installer-v1.1.2.tgz
$ tar xvf harbor-offline-installer-v1.1.2.tgz
2.配置Harbor
解压缩之后,目录下回生成harbor.conf文件,该文件就是Harbor的配置文件。
## Configuration file of Harbor
# hostname设置访问地址,可以使用ip、域名,不可以设置为127.0.0.1或localhosthostname = 10.236.63.76
# 访问协议,默认是http,也可以设置https,如果设置https,则nginx ssl需要设置on
ui_url_protocol = http
# mysql数据库root用户默认密码root123,实际使用时修改下
db_password = root123
max_job_workers = 3
customize_crt = on
ssl_cert = /data/cert/server.crt
ssl_cert_key = /data/cert/server.key
secretkey_path = /data
admiral_url = NA
# 邮件设置,发送重置密码邮件时使用
email_identity =
email_server = smtp.mydomain.com
email_server_port = 25
email_username = sample_admin@mydomain.com
email_password = abc
email_from = admin email_ssl = false
# 启动Harbor后,管理员UI登录的密码,默认是Harbor12345
harbor_admin_password = Harbor12345
# 认证方式,这里支持多种认证方式,如LADP、本次存储、数据库认证。默认是db_auth,mysql数据库认证
auth_mode = db_auth
# LDAP认证时配置项
#ldap_url = ldaps://ldap.mydomain.com
#ldap_searchdn = uid=searchuser,ou=people,dc=mydomain,dc=com#ldap_search_pwd = password
#ldap_basedn = ou=people,dc=mydomain,dc=com
#ldap_filter = (objectClass=person)
#ldap_uid = uid
#ldap_scope = 3
#ldap_timeout = 5
# 是否开启自注册
self_registration = on
# Token有效时间,默认30分钟
token_expiration = 30
# 用户创建项目权限控制,默认是everyone(所有人),也可以设置为adminonly(只能管理员)
project_creation_restriction = everyone
verify_remote_cert = on
3.启动harbor
修改完配置文件后,在的当前目录执行./install.sh,Harbor服务就会根据当期目录下的docker-compose.yml开始下载依赖的镜像,检测并按照顺序依次启动各个服务,通过启动完成后,我们访问刚设置的hostname即可 http://10.236.63.76/,默认是80端口,如果端口占用,我们可以去修改docker-compose.yml文件中,对应服务的端口映射。
4.登陆harbor并创建一个test项目
5.上传镜像
1、admin登录
$ docker login 10.236.63.76
Username: admin
Password:
Login Succeeded
2、给镜像打tag$ docker tag test/hello-world:0.0.1 10.236.63.76/test/hello-world:0.0.1
3. 使用docker push 10.236.63.76/test/ hello-world :0.0.1 将镜像push到仓库
6.拉取镜像
1、admin登录
$ docker login 10.236.63.76
Username: admin
Password:
Login Succeeded
2.使用docker pull 10.236.63.62/test/hello-world:0.0.1拉取镜像
注:docker login登陆报错可以尝试以下方法
Centos7系统:vi /etc/sysconfig/docker
在OPTIONS的参数中添加--insecure-registry 10.236.63.76
如:OPTIONS=’--selinux-enabled ----insecure-registry 10.236.63.76’
或者vi /etc/docker/daemon.json
以json串的形式添加该键值对
重启docker
systemctl daemon-reload
Systemctl restart docker
参考:https://blog.csdn.net/aixiaoyang168/article/details/73549898
4.创建helloworld pod和服务
注:进行本步骤之前请部署kubernetes集群,建议使用ansible一键部署新版kubernetes,建议1.9版本以上,便于在之后安装helm。
1.编写helloworld-deployment.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: hello-world
spec:
replicas: 1
template:
metadata:
labels:
app: hello-world
spec:
containers:
- name: hello-world
image: 172.16.2.10/test/helloworld:0.0.1
livenessProbe:
httpGet:
path: /healthz
port:8000
scheme:HTTP
initialDelaySeconds:30
timeoutSeconds:5
successThreshold:1
failureThreshold:5
ports:
-containerPort:8000
2.编写helloworld-service.yaml
apiVersion: v1
kind: Service
metadata:
name: hello-world
spec:
type: NodePort
ports:
- port: 8000
nodePort: 30001
selector:
app: hello-world
3.创建helloworld
kubectl create -f helloworld-deployment.yaml
kubectl create -f helloworld-service.yaml
通过访问http://本机IP:30001成功访问
5.搭建helm并将helloworld打包charts
注:搭建Helm要求在k8s环境下,且k8s为较新版本,推荐1.9版本以上
1.Helm客户端的安装
#下载helm客户端压缩包
wget https://github.com/helm/helm/archive/v2.9.1.tar.gz
# 解压压缩包
tar -zxvf helm-2.9.1.tar.gz
# 把 helm 指令放到bin目录下
mv helm-2.9.1/helm /usr/local/bin/helm
# 验证
helm help
2.安装Helm服务端
1.在kubernetes每个节点上安装socat
yum install -y socat
2.安装服务端(Tiller)
# 创建服务端
helm init --service-account tiller --upgrade -i registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.9.1 --stable-repo-url https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
# 创建TLS认证服务端,参考地址:https://github.com/gjmzj/kubeasz/blob/master/docs/guide/helm.mdhelm init --service-account tiller --upgrade -i registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.9.1 --tiller-tls-cert /etc/kubernetes/ssl/tiller001.pem --tiller-tls-key /etc/kubernetes/ssl/tiller001-key.pem --tls-ca-cert /etc/kubernetes/ssl/ca.pem --tiller-namespace kube-system --stable-repo-url https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
如遇到错误 failed to list: configmaps is forbidden: User “system:serviceaccount:kube-system:default” cannot list configmaps in the namespace “kube-system”,给它分配集群管理权限
kubectl create serviceaccount --namespace kube-system tiller
kubectl create clusterrolebinding tiller-cluster-rule --clusterrole=cluster-admin --serviceaccount=kube-system:tiller
kubectl patch deploy --namespace kube-system tiller-deploy -p '{"spec":{"template":{"spec":{"serviceAccount":"tiller"}}}}'
3.验证安装成功
# 查看 helm 版本信息
helm version
Client: &version.Version{SemVer:"v2.9.1", GitCommit:"20adb27c7c5868466912eebdf6664e7390ebe710", GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.9.1", GitCommit:"20adb27c7c5868466912eebdf6664e7390ebe710", GitTreeState:"clean"}
3.创建charts
1.创建名为hello-world的charts
helm create hello-world
2.将之前创建的可运行的helloworld-deployment.yaml和helloworld-service.yaml放入templates文件夹下
注:helloworld程序简单,程序不需引入相关依赖,也不需要传入参数。charts提供了版本控制,引入依赖,传参等配置文件。
3.打包tar
helm package ./hello-world
4.在本地创建charts文件夹,并将打包的tar文件移入,生成index.yaml
mv hello-world-0.1.0.tgz charts/
helm serve --repo-path ./charts
6.同步github,实现oneccp应用商店部署
1.安装git
yum -y install git
2.修改项目
#通过git clone或git push拉取项目
git clone https://github.com/Yunjuzhen/charts.git
#修改index.yaml文件,在结尾时间前添加本地charts/index.yaml内容如下:
hello-world:
- apiVersion: v1
appVersion: "1.0"
created: 2018-07-19T15:02:12.912875054+08:00
description: A Helm chart for Kubernetes
digest: 00d3dd0b553c3cb443fd8fca3b1c17b97ec478458eaa56ddff868e2d2605bc7f
name: hello-world
urls:
- http://127.0.0.1:8879/hello-world-0.1.0.tgz
version: 0.1.0
#在stable文件下添加hello-world目录,目录下添加版本0.1.0,版本内部添加hello-world的charts源代码,目录格式如下:
charts/stable/hello-world/0.1.0/hello-world/
3.同步至github
git add .
git status
git commit -m "Hello world!"
git push