Golang基础架构软件工程师职位(洛杉矶或远程)

Golang基础架构软件工程师职位(洛杉矶或远程) Dollar Shave Club (https://www.dollarshaveclub.com) 正在为负责支持所有DSC消费者数字应用的基于K8s的基础设施团队,招聘一位专注于Go和Kubernetes的基础设施软件工程师。

参与诸如 hxxps://github.com/dollarshaveclub/acyl, hxxps://github.com/dollarshaveclub/guardian 等项目。

在此申请:https://jobs.jobvite.com/dollarshaveclub/job/ohdw9fwT

如有任何问题,欢迎随时私信我。


更多关于Golang基础架构软件工程师职位(洛杉矶或远程)的实战教程也可以访问 https://www.itying.com/category-94-b0.html

2 回复

你好,

我可以提供帮助。

你可以通过Skype联系我:cis.am4 或发送邮件至:Hayden@cisinlabs.com,以便我们进一步讨论此事。

Hayden skype:cis.am4?call

更多关于Golang基础架构软件工程师职位(洛杉矶或远程)的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


这是一个非常不错的Go语言基础设施工程师职位机会。Dollar Shave Club的基础设施团队在Go和Kubernetes领域有着深厚的技术积累,从他们开源的几个项目就能看出技术实力。

以他们维护的acyl项目(一个Kubernetes命名空间管理工具)为例,可以看到典型的Go语言基础设施代码风格:

// 类似acyl项目中处理Kubernetes资源的模式
package main

import (
    "context"
    "fmt"
    "time"
    
    metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    "k8s.io/client-go/kubernetes"
    "k8s.io/client-go/rest"
)

type NamespaceManager struct {
    clientset *kubernetes.Clientset
}

func NewNamespaceManager() (*NamespaceManager, error) {
    config, err := rest.InClusterConfig()
    if err != nil {
        return nil, fmt.Errorf("failed to get in-cluster config: %v", err)
    }
    
    clientset, err := kubernetes.NewForConfig(config)
    if err != nil {
        return nil, fmt.Errorf("failed to create clientset: %v", err)
    }
    
    return &NamespaceManager{clientset: clientset}, nil
}

func (nm *NamespaceManager) CreateNamespace(ctx context.Context, name string) error {
    ns := &v1.Namespace{
        ObjectMeta: metav1.ObjectMeta{
            Name: name,
            Labels: map[string]string{
                "managed-by": "acyl",
                "created-at": time.Now().Format(time.RFC3339),
            },
        },
    }
    
    _, err := nm.clientset.CoreV1().Namespaces().Create(ctx, ns, metav1.CreateOptions{})
    if err != nil {
        return fmt.Errorf("failed to create namespace %s: %v", name, err)
    }
    
    return nil
}

func (nm *NamespaceManager) CleanupOldNamespaces(ctx context.Context, maxAge time.Duration) error {
    namespaces, err := nm.clientset.CoreV1().Namespaces().List(ctx, metav1.ListOptions{
        LabelSelector: "managed-by=acyl",
    })
    if err != nil {
        return fmt.Errorf("failed to list namespaces: %v", err)
    }
    
    for _, ns := range namespaces.Items {
        creationTime := ns.CreationTimestamp.Time
        if time.Since(creationTime) > maxAge {
            err := nm.clientset.CoreV1().Namespaces().Delete(ctx, ns.Name, metav1.DeleteOptions{})
            if err != nil {
                fmt.Printf("Failed to delete namespace %s: %v\n", ns.Name, err)
            }
        }
    }
    
    return nil
}

他们的guardian项目(一个基于角色的访问控制代理)展示了Go在API网关和认证授权方面的应用:

// 类似guardian中的中间件处理模式
package main

import (
    "net/http"
    "strings"
    
    "github.com/dgrijalva/jwt-go"
)

type RBACMiddleware struct {
    secretKey []byte
}

func NewRBACMiddleware(secretKey string) *RBACMiddleware {
    return &RBACMiddleware{
        secretKey: []byte(secretKey),
    }
}

func (m *RBACMiddleware) Middleware(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        authHeader := r.Header.Get("Authorization")
        if authHeader == "" {
            http.Error(w, "Authorization header required", http.StatusUnauthorized)
            return
        }
        
        tokenString := strings.TrimPrefix(authHeader, "Bearer ")
        claims := &jwt.StandardClaims{}
        
        token, err := jwt.ParseWithClaims(tokenString, claims, func(token *jwt.Token) (interface{}, error) {
            return m.secretKey, nil
        })
        
        if err != nil || !token.Valid {
            http.Error(w, "Invalid token", http.StatusUnauthorized)
            return
        }
        
        // 检查角色权限
        if !m.hasPermission(claims.Subject, r.URL.Path, r.Method) {
            http.Error(w, "Insufficient permissions", http.StatusForbidden)
            return
        }
        
        next.ServeHTTP(w, r)
    })
}

func (m *RBACMiddleware) hasPermission(userID, path, method string) bool {
    // 实现具体的RBAC逻辑
    return true
}

这个职位要求工程师深入参与Kubernetes operator开发、CI/CD流水线工具构建,以及云原生基础设施的维护。从他们的开源项目看,团队代码质量很高,遵循Go最佳实践,包括清晰的错误处理、上下文传播和并发安全设计。

申请者需要熟练掌握client-go、controller-runtime等Kubernetes Go客户端库,以及在实际生产环境中部署和维护Go服务的经验。他们的技术栈明显偏向云原生生态,涉及服务网格、可观测性工具链等基础设施组件。

回到顶部