Files
my-rook-config/pkg/operator/ceph/nfs/spec.go
T
Blaine Gardner e8a638dcba ceph nfs: fix the host path for pod volume
Path previously did not use dataDirHostPath. It should, so fix this.

Signed-off-by: Blaine Gardner <blaine.gardner@suse.com>
2019-05-19 06:33:04 -06:00

195 lines
5.6 KiB
Go

/*
Copyright 2018 The Rook Authors. All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
// Package nfs for NFS ganesha
package nfs
import (
"fmt"
"path"
cephv1 "github.com/rook/rook/pkg/apis/ceph.rook.io/v1"
opmon "github.com/rook/rook/pkg/operator/ceph/cluster/mon"
opspec "github.com/rook/rook/pkg/operator/ceph/spec"
"github.com/rook/rook/pkg/operator/k8sutil"
apps "k8s.io/api/apps/v1"
v1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/util/intstr"
)
const (
appName = "rook-ceph-nfs"
ganeshaConfigVolume = "ganesha-config"
nfsPort = 2049
)
func (c *CephNFSController) createCephNFSService(n cephv1.CephNFS, name string) error {
labels := getLabels(n, name)
svc := &v1.Service{
ObjectMeta: metav1.ObjectMeta{
Name: instanceName(n, name),
Namespace: n.Namespace,
Labels: labels,
},
Spec: v1.ServiceSpec{
Selector: labels,
Ports: []v1.ServicePort{
{
Name: "nfs",
Port: nfsPort,
TargetPort: intstr.FromInt(int(nfsPort)),
Protocol: v1.ProtocolTCP,
},
},
},
}
k8sutil.SetOwnerRef(c.context.Clientset, n.Namespace, &svc.ObjectMeta, &c.ownerRef)
if c.hostNetwork {
svc.Spec.ClusterIP = v1.ClusterIPNone
}
svc, err := c.context.Clientset.CoreV1().Services(n.Namespace).Create(svc)
if err != nil {
if !errors.IsAlreadyExists(err) {
return fmt.Errorf("failed to create ganesha service. %+v", err)
}
logger.Infof("ceph nfs service already created")
return nil
}
logger.Infof("ceph nfs service running at %s:%d", svc.Spec.ClusterIP, nfsPort)
return nil
}
func (c *CephNFSController) makeDeployment(n cephv1.CephNFS, name, configName string) *apps.Deployment {
binariesEnvVar, binariesVolume, binariesMount := k8sutil.BinariesMountInfo()
deployment := &apps.Deployment{
ObjectMeta: metav1.ObjectMeta{
Name: instanceName(n, name),
Namespace: n.Namespace,
},
}
n.Spec.Server.Annotations.ApplyToObjectMeta(&deployment.ObjectMeta)
k8sutil.SetOwnerRef(c.context.Clientset, n.Namespace, &deployment.ObjectMeta, &c.ownerRef)
configMapSource := &v1.ConfigMapVolumeSource{
LocalObjectReference: v1.LocalObjectReference{Name: configName},
Items: []v1.KeyToPath{{Key: "config", Path: "ganesha.conf"}},
}
configVolume := v1.Volume{Name: ganeshaConfigVolume, VolumeSource: v1.VolumeSource{ConfigMap: configMapSource}}
podSpec := v1.PodSpec{
InitContainers: []v1.Container{c.initContainer(n, binariesEnvVar, binariesMount)},
Containers: []v1.Container{c.daemonContainer(n, name, binariesMount)},
RestartPolicy: v1.RestartPolicyAlways,
Volumes: append(
opspec.PodVolumes(c.dataDirHostPath, c.namespace),
configVolume,
binariesVolume,
),
HostNetwork: c.hostNetwork,
}
if c.hostNetwork {
podSpec.DNSPolicy = v1.DNSClusterFirstWithHostNet
}
n.Spec.Server.Placement.ApplyToPodSpec(&podSpec)
podTemplateSpec := v1.PodTemplateSpec{
ObjectMeta: metav1.ObjectMeta{
Name: instanceName(n, name),
Labels: getLabels(n, name),
},
Spec: podSpec,
}
n.Spec.Server.Annotations.ApplyToObjectMeta(&podTemplateSpec.ObjectMeta)
// Multiple replicas of the nfs service would be handled by creating a service and a new deployment for each one, rather than increasing the pod count here
replicas := int32(1)
deployment.Spec = apps.DeploymentSpec{
Selector: &metav1.LabelSelector{
MatchLabels: getLabels(n, name),
},
Template: podTemplateSpec,
Replicas: &replicas,
}
return deployment
}
func (c *CephNFSController) initContainer(n cephv1.CephNFS, binariesEnvVar v1.EnvVar, binariesMount v1.VolumeMount) v1.Container {
return v1.Container{
Args: []string{
"ceph",
"nfs",
"init",
},
Name: opspec.ConfigInitContainerName,
Image: c.rookImage,
VolumeMounts: append(
opspec.RookVolumeMounts(),
binariesMount),
Env: []v1.EnvVar{
binariesEnvVar,
opmon.ClusterNameEnvVar(n.Namespace),
opmon.EndpointEnvVar(),
opmon.AdminSecretEnvVar(),
k8sutil.PodIPEnvVar(k8sutil.PrivateIPEnvVar),
k8sutil.PodIPEnvVar(k8sutil.PublicIPEnvVar),
k8sutil.ConfigOverrideEnvVar(),
},
Resources: n.Spec.Server.Resources,
}
}
func (c *CephNFSController) daemonContainer(n cephv1.CephNFS, name string, binariesMount v1.VolumeMount) v1.Container {
configMount := v1.VolumeMount{Name: ganeshaConfigVolume, MountPath: "/etc/ganesha"}
return v1.Container{
Command: []string{
path.Join(k8sutil.BinariesMountPath, "tini"),
},
Args: []string{
"--", path.Join(k8sutil.BinariesMountPath, "rook"),
"ceph",
"nfs",
"run",
},
Name: "ceph-nfs",
Image: c.cephVersion.Image,
VolumeMounts: append(
opspec.CephVolumeMounts(),
configMount,
binariesMount,
),
Env: append(
k8sutil.ClusterDaemonEnvVars(c.cephVersion.Image),
v1.EnvVar{Name: "ROOK_CEPH_NFS_NAME", Value: name},
),
Resources: n.Spec.Server.Resources,
}
}
func getLabels(n cephv1.CephNFS, name string) map[string]string {
return map[string]string{
k8sutil.AppAttr: appName,
k8sutil.ClusterAttr: n.Namespace,
"ceph_nfs": n.Name,
"instance": name,
}
}