J'essaie d'exécuter Chart Museum en tant qu'utilisateur non root dans OpenShift. Voici un aperçu de mon YAML.
FROM alpine:3.10.3
RUN apk add --no-cache cifs-utils ca-certificates \
&& adduser -D -u 1000 chartmuseum
COPY bin/linux/amd64/chartmuseum /chartmuseum
USER 1000
ENTRYPOINT ["/chartmuseum"]
Comme vous pouvez le voir, j'ai défini spec.containers.securityContext.fsGroup sur 1000 qui est identique à l'ID utilisateur dans le Dockerfile Chart Museum comme indiqué ci-dessous.
apiVersion: apps/v1
kind: Deployment
metadata:
name: chart-museum
namespace: demo
spec:
selector:
matchLabels:
app: chart-museum
replicas: 1
template:
metadata:
labels:
app: chart-museum
spec:
volumes:
- name: pvc-charts
persistentVolumeClaim:
claimName: pvc-charts
containers:
- name: chart-museum
securityContext:
fsGroup: 1000
image: chartmuseum/chartmuseum:latest
ports:
- containerPort: 8080
envFrom:
- configMapRef:
name: chart-museum
volumeMounts:
- name: pvc-charts
mountPath: "/charts"
Et, pourtant, quand j'essaye de télécharger un graphique , je reçois un message d'autorisation refusée pour / charts code>. Comment contourner ce problème?
3 Réponses :
Il est lié à Kubernetes et à la façon dont le volume persistant donné est défini. Vous pouvez consulter toutes les discussions et les solutions de contournement possibles dans le problème GH associé . P >
Laissez-moi essayer l'option d'ajouter un chown ( github .com / kubernetes / kubernetes / issues /… ) Comme mentionné dans ma question, l'option fsGroup ( github.com/kubernetes/kubernetes/issues/... ) n'a pas fonctionné pour moi en fait.
Ajoutez les lignes chmod / chown dans votre fichier docker:
containers:
- name: chart-museum
securityContext:
runAsUser: 1000
runAsGroup: 1000
fsGroup: 1000
Modifiez votre spec.template.spec.containers.securityContext en assurez-vous que l'utilisateur et le groupe seront appliqués.
FROM alpine:3.10.3
RUN apk add --no-cache cifs-utils ca-certificates \
&& adduser -D -u 1000 chartmuseum
COPY bin/linux/amd64/chartmuseum /chartmuseum
RUN chmod +xr /chartmuseum
RUN chown 1000:1000 /chartmuseum
USER 1000
ENTRYPOINT ["/chartmuseum"]
Le YAML pour le déploiement était considéré comme valide uniquement lorsque fsGroup était supprimé. Ensuite, le déploiement a échoué avec cette raison impossible de valider par rapport à une contrainte de contexte de sécurité: [spec.containers [0] .securityContext.securityContext.runAsUse r: Valeur non valide: 1000: doit être dans les plages: [1000350000, 1000359999]]
Le problème vient de / charts . Comment votre Dockerfile résout-il ce problème? Et avec spec.template.spec.containers , fsGroup a été appelé comme invalide. Les valeurs numériques de runAsUser et runAsGroup ont été jugées trop faibles et le conteneur n'a jamais démarré.
Voici comment j'ai résolu le problème.
curl -LO https://s3.amazonaws.com/chartmuseum/release/latest/bin/linux/amd64/chartmuseum . chmod + xr chartmuseum Dockerfile comme indiqué ci-dessous. En gros, utilisez le nom d'utilisateur au lieu de l'ID pour les commandes chown afin que le binaire et l'emplacement de stockage appartiennent à l'utilisateur chartmuseum et non à root . docker run --rm -it \ -p 8080:8080 \ -v $(pwd)/charts:/charts \ -e DEBUG=true \ -e STORAGE=local \ -e STORAGE_LOCAL_ROOTDIR=/charts \ chartmuseum/chartmuseum:latest
somerepo / chartmuseum: 0.0.0 . PersistentVolumeClaim n'est pas traitée ici. kind: ConfigMap
apiVersion: v1
metadata:
name: chart-museum
namespace: demo
data:
DEBUG: 'true'
STORAGE: local
STORAGE_LOCAL_ROOTDIR: "/charts"
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: chart-museum
namespace: demo
spec:
selector:
matchLabels:
app: chart-museum
replicas: 1
template:
metadata:
labels:
app: chart-museum
spec:
volumes:
- name: pvc-charts
persistentVolumeClaim:
claimName: pvc-charts
containers:
- name: chart-museum
image: somerepo/chartmuseum:0.0.0
imagePullPolicy: Always
ports:
- containerPort: 8080
envFrom:
- configMapRef:
name: chart-museum
volumeMounts:
- mountPath: "/charts"
name: pvc-charts
resources:
limits:
memory: "128Mi"
cpu: "500m"
imagePullSecrets:
- name: us.icr.io.secret
---
apiVersion: v1
kind: Service
metadata:
labels:
app: chart-museum
name: chart-museum
namespace: demo
spec:
type: ClusterIP
ports:
- name: 8080-tcp
port: 8080
protocol: TCP
targetPort: 8080
selector:
app: chart-museum
---
apiVersion: route.openshift.io/v1
kind: Route
metadata:
labels:
app: chart-museum
name: chart-museum
namespace: demo
spec:
port:
targetPort: 8080-tcp
tls:
insecureEdgeTerminationPolicy: Redirect
termination: edge
to:
kind: Service
name: chart-museum
Le manifeste crée un objet ConfigMap et utilise un PersistentVolumeClaim pour «répliquer» la commande pour exécuter Chart Museum localement (comme décrit sur https://chartmuseum.com/ )
FROM alpine:3.10.3
RUN apk add --no-cache cifs-utils ca-certificates \
&& adduser -D -u 1000 chartmuseum
COPY chartmuseum /chartmuseum
RUN chown chartmuseum:chartmuseum /chartmuseum
RUN chown chartmuseum:chartmuseum /charts
USER chartmuseum
ENTRYPOINT ["/chartmuseum"]
Le Service et la Route du manifeste exposent le dépôt au monde externe.
HOST / PORT dans oc get route / chart-museum -n demo avec https dans barre d'adresse et appuyez sur Entrée. Vous devriez voir une page d'accueil pour Chart Museum. Cela signifie que l'installation est réussie.