forked from LaconicNetwork/kompose
parent
771ecbf471
commit
0b331d9e5d
@ -165,6 +165,13 @@ The currently supported options are:
|
|||||||
| kompose.controller.type | deployment / daemonset / replicationcontroller |
|
| kompose.controller.type | deployment / daemonset / replicationcontroller |
|
||||||
| kompose.image-pull-policy | kubernetes pods imagePullPolicy |
|
| kompose.image-pull-policy | kubernetes pods imagePullPolicy |
|
||||||
| kompose.image-pull-secret | kubernetes secret name for imagePullSecrets |
|
| kompose.image-pull-secret | kubernetes secret name for imagePullSecrets |
|
||||||
|
| kompose.service.healthcheck.readiness.test | kubernetes readiness exec command |
|
||||||
|
| kompose.service.healthcheck.readiness.interval | kubernetes readiness interval value |
|
||||||
|
| kompose.service.healthcheck.readiness.timeout | kubernetes readiness timeout value |
|
||||||
|
| kompose.service.healthcheck.readiness.retries | kubernetes readiness retries value |
|
||||||
|
| kompose.service.healthcheck.readiness.start_period | kubernetes readiness start_period |
|
||||||
|
| kompose.service.healthcheck.liveness.http_get_path | kubernetes liveness httpGet path |
|
||||||
|
| kompose.service.healthcheck.liveness.http_get_port | kubernetes liveness httpGet port |
|
||||||
|
|
||||||
**Note**: `kompose.service.type` label should be defined with `ports` only (except for headless service), otherwise `kompose` will fail.
|
**Note**: `kompose.service.type` label should be defined with `ports` only (except for headless service), otherwise `kompose` will fail.
|
||||||
|
|
||||||
@ -289,6 +296,42 @@ services:
|
|||||||
kompose.image-pull-policy: "Never"
|
kompose.image-pull-policy: "Never"
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
For example:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
version: '2'
|
||||||
|
services:
|
||||||
|
example-service:
|
||||||
|
image: example-image
|
||||||
|
labels:
|
||||||
|
kompose.service.healthcheck.liveness.http_get_path: /health/ping
|
||||||
|
kompose.service.healthcheck.liveness.http_get_port: 8080
|
||||||
|
healthcheck:
|
||||||
|
interval: 10s
|
||||||
|
timeout: 10s
|
||||||
|
retries: 3
|
||||||
|
start_period: 30s
|
||||||
|
```
|
||||||
|
|
||||||
|
- `kompose.service.healthcheck.liveness` defines Kubernetes [liveness HttpRequest](https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/#define-a-liveness-http-request), If you use healthcheck without liveness labels, have to define `test` in healcheck it's work to Kubernetes [liveness command](https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/#define-readiness-probes)
|
||||||
|
|
||||||
|
For example:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
version: '2'
|
||||||
|
services:
|
||||||
|
example-service:
|
||||||
|
image: example-image
|
||||||
|
labels:
|
||||||
|
kompose.service.healthcheck.readiness.test: CMD curl -f "http://localhost:8080/health/ping"
|
||||||
|
kompose.service.healthcheck.readiness.interval: 10s
|
||||||
|
kompose.service.healthcheck.readiness.timeout: 10s
|
||||||
|
kompose.service.healthcheck.readiness.retries: 3
|
||||||
|
kompose.service.healthcheck.readiness.start_period: 30s
|
||||||
|
```
|
||||||
|
- `kompose.service.healthcheck.readiness` defines Kubernetes [readiness](https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/#define-readiness-probes)
|
||||||
|
|
||||||
## Restart
|
## Restart
|
||||||
|
|
||||||
If you want to create normal pods without controller you can use `restart` construct of docker-compose to define that. Follow table below to see what happens on the `restart` value.
|
If you want to create normal pods without controller you can use `restart` construct of docker-compose to define that. Follow table below to see what happens on the `restart` value.
|
||||||
|
|||||||
@ -164,6 +164,8 @@ type HealthCheck struct {
|
|||||||
Retries int32
|
Retries int32
|
||||||
StartPeriod int32
|
StartPeriod int32
|
||||||
Disable bool
|
Disable bool
|
||||||
|
HTTPPath string
|
||||||
|
HTTPPort int32
|
||||||
}
|
}
|
||||||
|
|
||||||
// EnvVar holds the environment variable struct of a container
|
// EnvVar holds the environment variable struct of a container
|
||||||
|
|||||||
@ -57,7 +57,39 @@ func TestParseHealthCheck(t *testing.T) {
|
|||||||
Retries: 2,
|
Retries: 2,
|
||||||
StartPeriod: 3,
|
StartPeriod: 3,
|
||||||
}
|
}
|
||||||
output, err := parseHealthCheck(check)
|
output, err := parseHealthCheck(check, nil)
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("Unable to convert HealthCheckConfig: %s", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if !reflect.DeepEqual(output, expected) {
|
||||||
|
t.Errorf("Structs are not equal, expected: %v, output: %v", expected, output)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestParseHttpHealthCheck(t *testing.T) {
|
||||||
|
helperValue := uint64(2)
|
||||||
|
check := types.HealthCheckConfig{
|
||||||
|
Timeout: durationTypesPtr(1 * time.Second),
|
||||||
|
Interval: durationTypesPtr(2 * time.Second),
|
||||||
|
Retries: &helperValue,
|
||||||
|
StartPeriod: durationTypesPtr(3 * time.Second),
|
||||||
|
}
|
||||||
|
label := types.Labels{
|
||||||
|
HealthCheckLivenessHTTPGetPath: "ping",
|
||||||
|
HealthCheckLivenessHTTPGetPort: "80",
|
||||||
|
}
|
||||||
|
|
||||||
|
// CMD-SHELL or SHELL is included Test within docker/cli, thus we remove the first value in Test
|
||||||
|
expected := kobject.HealthCheck{
|
||||||
|
HTTPPath: "ping",
|
||||||
|
HTTPPort: 80,
|
||||||
|
Timeout: 1,
|
||||||
|
Interval: 2,
|
||||||
|
Retries: 2,
|
||||||
|
StartPeriod: 3,
|
||||||
|
}
|
||||||
|
output, err := parseHealthCheck(check, label)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("Unable to convert HealthCheckConfig: %s", err)
|
t.Errorf("Unable to convert HealthCheckConfig: %s", err)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -56,6 +56,10 @@ const (
|
|||||||
HealthCheckReadinessRetries = "kompose.service.healthcheck.readiness.retries"
|
HealthCheckReadinessRetries = "kompose.service.healthcheck.readiness.retries"
|
||||||
// HealthCheckReadinessStartPeriod defines readiness health check start period
|
// HealthCheckReadinessStartPeriod defines readiness health check start period
|
||||||
HealthCheckReadinessStartPeriod = "kompose.service.healthcheck.readiness.start_period"
|
HealthCheckReadinessStartPeriod = "kompose.service.healthcheck.readiness.start_period"
|
||||||
|
// HealthCheckLivenessHTTPGetPath defines liveness health check HttpGet path
|
||||||
|
HealthCheckLivenessHTTPGetPath = "kompose.service.healthcheck.liveness.http_get_path"
|
||||||
|
// HealthCheckLivenessHTTPGetPort defines liveness health check HttpGet port
|
||||||
|
HealthCheckLivenessHTTPGetPort = "kompose.service.healthcheck.liveness.http_get_port"
|
||||||
|
|
||||||
// ServiceTypeHeadless ...
|
// ServiceTypeHeadless ...
|
||||||
ServiceTypeHeadless = "Headless"
|
ServiceTypeHeadless = "Headless"
|
||||||
|
|||||||
@ -288,8 +288,11 @@ func parseHealthCheckReadiness(labels types.Labels) (kobject.HealthCheck, error)
|
|||||||
/* Convert the HealthCheckConfig as designed by Docker to
|
/* Convert the HealthCheckConfig as designed by Docker to
|
||||||
a Kubernetes-compatible format.
|
a Kubernetes-compatible format.
|
||||||
*/
|
*/
|
||||||
func parseHealthCheck(composeHealthCheck types.HealthCheckConfig) (kobject.HealthCheck, error) {
|
func parseHealthCheck(composeHealthCheck types.HealthCheckConfig, labels types.Labels) (kobject.HealthCheck, error) {
|
||||||
var timeout, interval, retries, startPeriod int32
|
var timeout, interval, retries, startPeriod int32
|
||||||
|
var test []string
|
||||||
|
var httpPort int32
|
||||||
|
var httpPath string
|
||||||
|
|
||||||
// Here we convert the timeout from 1h30s (example) to 36030 seconds.
|
// Here we convert the timeout from 1h30s (example) to 36030 seconds.
|
||||||
if composeHealthCheck.Timeout != nil {
|
if composeHealthCheck.Timeout != nil {
|
||||||
@ -320,9 +323,24 @@ func parseHealthCheck(composeHealthCheck types.HealthCheckConfig) (kobject.Healt
|
|||||||
startPeriod = int32(parse.Seconds())
|
startPeriod = int32(parse.Seconds())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if composeHealthCheck.Test != nil {
|
||||||
|
test = composeHealthCheck.Test[1:]
|
||||||
|
}
|
||||||
|
|
||||||
|
for key, value := range labels {
|
||||||
|
switch key {
|
||||||
|
case HealthCheckLivenessHTTPGetPath:
|
||||||
|
httpPath = value
|
||||||
|
case HealthCheckLivenessHTTPGetPort:
|
||||||
|
httpPort = cast.ToInt32(value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Due to docker/cli adding "CMD-SHELL" to the struct, we remove the first element of composeHealthCheck.Test
|
// Due to docker/cli adding "CMD-SHELL" to the struct, we remove the first element of composeHealthCheck.Test
|
||||||
return kobject.HealthCheck{
|
return kobject.HealthCheck{
|
||||||
Test: composeHealthCheck.Test[1:],
|
Test: test,
|
||||||
|
HTTPPath: httpPath,
|
||||||
|
HTTPPort: httpPort,
|
||||||
Timeout: timeout,
|
Timeout: timeout,
|
||||||
Interval: interval,
|
Interval: interval,
|
||||||
Retries: retries,
|
Retries: retries,
|
||||||
@ -384,7 +402,7 @@ func dockerComposeToKomposeMapping(composeObject *types.Config) (kobject.Kompose
|
|||||||
// HealthCheck Liveness
|
// HealthCheck Liveness
|
||||||
if composeServiceConfig.HealthCheck != nil && !composeServiceConfig.HealthCheck.Disable {
|
if composeServiceConfig.HealthCheck != nil && !composeServiceConfig.HealthCheck.Disable {
|
||||||
var err error
|
var err error
|
||||||
serviceConfig.HealthChecks.Liveness, err = parseHealthCheck(*composeServiceConfig.HealthCheck)
|
serviceConfig.HealthChecks.Liveness, err = parseHealthCheck(*composeServiceConfig.HealthCheck, *&composeServiceConfig.Labels)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return kobject.KomposeObject{}, errors.Wrap(err, "Unable to parse health check")
|
return kobject.KomposeObject{}, errors.Wrap(err, "Unable to parse health check")
|
||||||
}
|
}
|
||||||
|
|||||||
@ -44,6 +44,7 @@ import (
|
|||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
|
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
|
||||||
"k8s.io/apimachinery/pkg/runtime"
|
"k8s.io/apimachinery/pkg/runtime"
|
||||||
|
"k8s.io/apimachinery/pkg/util/intstr"
|
||||||
)
|
)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -511,6 +512,14 @@ func (k *Kubernetes) UpdateKubernetesObjects(name string, service kobject.Servic
|
|||||||
Command: service.HealthChecks.Liveness.Test,
|
Command: service.HealthChecks.Liveness.Test,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
} else if !reflect.ValueOf(service.HealthChecks.Liveness.HTTPPath).IsZero() &&
|
||||||
|
!reflect.ValueOf(service.HealthChecks.Liveness.HTTPPort).IsZero() {
|
||||||
|
probe.Handler = api.Handler{
|
||||||
|
HTTPGet: &api.HTTPGetAction{
|
||||||
|
Path: service.HealthChecks.Liveness.HTTPPath,
|
||||||
|
Port: intstr.FromInt(int(service.HealthChecks.Liveness.HTTPPort)),
|
||||||
|
},
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
return errors.New("Health check must contain a command")
|
return errors.New("Health check must contain a command")
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user