mirror of
https://github.com/containers/podman.git
synced 2025-06-18 07:28:57 +08:00
Update init ctr default for play kube
Update the init container type default to once instead of always to match k8s behavior. Add a new annotation that can be used to change the init ctr type in the kube yaml. Signed-off-by: Urvashi Mohnani <umohnani@redhat.com>
This commit is contained in:

committed by
Matthew Heon

parent
6057db75d8
commit
c3c07ed09e
@ -22,7 +22,7 @@ Currently, the supported Kubernetes kinds are:
|
||||
|
||||
Only two volume types are supported by play kube, the *hostPath* and *persistentVolumeClaim* volume types. For the *hostPath* volume type, only the *default (empty)*, *DirectoryOrCreate*, *Directory*, *FileOrCreate*, *File*, *Socket*, *CharDevice* and *BlockDevice* subtypes are supported. Podman interprets the value of *hostPath* *path* as a file path when it contains at least one forward slash, otherwise Podman treats the value as the name of a named volume. When using a *persistentVolumeClaim*, the value for *claimName* is the name for the Podman named volume.
|
||||
|
||||
Note: When playing a kube YAML with init containers, the init container will be created with init type value `always`.
|
||||
Note: When playing a kube YAML with init containers, the init container will be created with init type value `once`. To change the default type, use the `io.podman.annotations.init.container.type` annotation to set the type to `always`.
|
||||
|
||||
Note: *hostPath* volume types created by play kube will be given an SELinux shared label (z), bind mounts are not relabeled (use `chcon -t container_file_t -R <directory>`).
|
||||
|
||||
|
@ -135,6 +135,11 @@ const (
|
||||
// creating a checkpoint image to specify the name of host distribution on
|
||||
// which the checkpoint was created.
|
||||
CheckpointAnnotationDistributionName = "io.podman.annotations.checkpoint.distribution.name"
|
||||
|
||||
// InitContainerType is used by play kube when playing a kube yaml to specify the type
|
||||
// of the init container.
|
||||
InitContainerType = "io.podman.annotations.init.container.type"
|
||||
|
||||
// MaxKubeAnnotation is the max length of annotations allowed by Kubernetes.
|
||||
MaxKubeAnnotation = 63
|
||||
)
|
||||
|
@ -507,13 +507,17 @@ func (ic *ContainerEngine) playKubePod(ctx context.Context, podName string, podY
|
||||
for k, v := range podSpec.PodSpecGen.Labels { // add podYAML labels
|
||||
labels[k] = v
|
||||
}
|
||||
initCtrType := annotations[define.InitContainerType]
|
||||
if initCtrType == "" {
|
||||
initCtrType = define.OneShotInitContainer
|
||||
}
|
||||
|
||||
specgenOpts := kube.CtrSpecGenOptions{
|
||||
Annotations: annotations,
|
||||
ConfigMaps: configMaps,
|
||||
Container: initCtr,
|
||||
Image: pulledImage,
|
||||
InitContainerType: define.AlwaysInitContainer,
|
||||
InitContainerType: initCtrType,
|
||||
Labels: labels,
|
||||
LogDriver: options.LogDriver,
|
||||
LogOptions: options.LogOptions,
|
||||
|
@ -1559,8 +1559,10 @@ var _ = Describe("Podman play kube", func() {
|
||||
})
|
||||
|
||||
// If you have an init container in the pod yaml, podman should create and run the init container with play kube
|
||||
It("podman play kube test with init containers", func() {
|
||||
pod := getPod(withPodInitCtr(getCtr(withImage(ALPINE), withCmd([]string{"echo", "hello"}), withInitCtr(), withName("init-test"))), withCtr(getCtr(withImage(ALPINE), withCmd([]string{"top"}))))
|
||||
// With annotation set to always
|
||||
It("podman play kube test with init containers and annotation set", func() {
|
||||
// With the init container type annotation set to always
|
||||
pod := getPod(withAnnotation("io.podman.annotations.init.container.type", "always"), withPodInitCtr(getCtr(withImage(ALPINE), withCmd([]string{"echo", "hello"}), withInitCtr(), withName("init-test"))), withCtr(getCtr(withImage(ALPINE), withCmd([]string{"top"}))))
|
||||
err := generateKubeYaml("pod", pod, kubeYaml)
|
||||
Expect(err).To(BeNil())
|
||||
|
||||
@ -1585,6 +1587,29 @@ var _ = Describe("Podman play kube", func() {
|
||||
Expect(inspect.OutputToString()).To(ContainSubstring("running"))
|
||||
})
|
||||
|
||||
// If you have an init container in the pod yaml, podman should create and run the init container with play kube
|
||||
// Using default init container type (once)
|
||||
It("podman play kube test with init container type set to default value", func() {
|
||||
// Using the default init container type (once)
|
||||
pod := getPod(withPodInitCtr(getCtr(withImage(ALPINE), withCmd([]string{"echo", "hello"}), withInitCtr(), withName("init-test"))), withCtr(getCtr(withImage(ALPINE), withCmd([]string{"top"}))))
|
||||
err := generateKubeYaml("pod", pod, kubeYaml)
|
||||
Expect(err).To(BeNil())
|
||||
|
||||
kube := podmanTest.Podman([]string{"play", "kube", kubeYaml})
|
||||
kube.WaitWithDefaultTimeout()
|
||||
Expect(kube).Should(Exit(0))
|
||||
|
||||
// Expect the number of containers created to be 2, infra and regular container
|
||||
numOfCtrs := podmanTest.NumberOfContainers()
|
||||
Expect(numOfCtrs).To(Equal(2))
|
||||
|
||||
// Regular container should be in running state
|
||||
inspect := podmanTest.Podman([]string{"inspect", "--format", "{{.State.Status}}", "testPod-" + defaultCtrName})
|
||||
inspect.WaitWithDefaultTimeout()
|
||||
Expect(inspect).Should(Exit(0))
|
||||
Expect(inspect.OutputToString()).To(ContainSubstring("running"))
|
||||
})
|
||||
|
||||
// If you supply only args for a Container, the default Entrypoint defined in the Docker image is run with the args that you supplied.
|
||||
It("podman play kube test correct command with only set args in yaml file", func() {
|
||||
pod := getPod(withCtr(getCtr(withImage(REGISTRY_IMAGE), withCmd(nil), withArg([]string{"echo", "hello"}))))
|
||||
|
Reference in New Issue
Block a user